Externe Ausgabe -> ListStore

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Hallo.

Ich schreibe gerade an einem GUI für pacman (Linux-Paketmanager).

Soweit funktioniert auch alles wie gewünscht. Jedenfalls von meiner Seite her.

Jetzt wurde aber der Wunsch geäußert, dass man über das GUI auch ein Update durchführen können soll.

Bisher hab ich eigentlich immer nur die Ausgabe von pacman in meinem Skript weiter verarbeitet. Doch jetzt gestaltet sich das verdammt schwierig!

Hier mal die Ausgabe, die ich in ein ListStore bannen müsste:

Code: Alles auswählen

:: Replace fam with gaim from "current"? [Y/n] :: Upgrade pacman first? [Y/n]
Remove:  fam

Targets: bootsplash-3.1-8 fontconfig-2.2.3-7 gdm-2.6.0.7-1 ggv-2.8.3-1
         glib2-2.6.2-1 glibc-2.3.4-1 gnome-common-2.8.0-5 gnome-mag-0.11.14-1
         gnome-nettool-1.1.0-1 gamin-0.0.22-1 gnome-vfs-2.8.3-5, etc...

Total Package Size:    83.5 MB

Proceed with upgrade? [Y/n]
Was in den ListStore soll, wäre in dem Beispiel bootsplash-3.1-8, fontconfig-2.2.3-7, gdm-2.6.0.7-1, ggv-2.8.3-1, glib2-2.6.2-1, glibc-2.3.4-1, gnome-common-2.8.0-5, gnome-mag-0.11.14-1, gnome-nettool-1.1.0-1, gamin-0.0.22-1, gnome-vfs-2.8.3-5, etc...

Nur ich muss zugeben, dass ich gerade überhaupt keine Idee habe, wie ich das bewerkstelligen soll. Dafür ist die Ausgabe zu konfus.

Kann mir hier jemand bitte weiterhelfen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie wäre es mit einer Regex die Ausgabe zu splitten?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Hab ich mir auch schon überlegt. Aber wie soll ich den aufbauen?

Irgendwie komm ich nicht wirklich mit Regex klar. Wie man ja sieht, sind die Paketnamen nicht wirklich immer eindeutig.

Man kann also nicht sagen, [a-z]+-[0-9.]+-[0-9].

Zumal der Regex eh nicht wirklich funktionieren wird. :cry:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi bmhi1980,

könntest du die genaue Ausgabe mal mit Copy & Paste zeigen? Sind die Paketnamen mit oder ohne "," getrennt? Kommt dann wirklich immer ein ", etc..."?

Hier mal eine vorläufige Regex:

Code: Alles auswählen

re.findall(r'Targets: (.+?)Total Package Size:(?uism)', text)[0].split()

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Es geht aber auch ohne Regex, wenn dir das lieber ist:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
st = """:: Replace fam with gaim from "current"? [Y/n] :: Upgrade pacman first? [Y/n]
Remove:  fam

Targets: bootsplash-3.1-8 fontconfig-2.2.3-7 gdm-2.6.0.7-1 ggv-2.8.3-1
         glib2-2.6.2-1 glibc-2.3.4-1 gnome-common-2.8.0-5 gnome-mag-0.11.14-1
         gnome-nettool-1.1.0-1 gamin-0.0.22-1 gnome-vfs-2.8.3-5

Total Package Size:    83.5 MB

Proceed with upgrade? [Y/n]"""

packages = st[st.find('Targets') + len('Targets: '):st.rfind('Total Package Size')].split()
print packages
Dabei wird der String von 'Targets' bis 'Total Package Size' zerschnitten (wobei 'Targets: ' in den Anfangspunkt eingezählt wird) und dann nach Whitespaces gesplittet wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Ui, Leonidas!

Kommt genau das bei raus, was ich brauche. :D

Aber könntest du mir das bitte etwas näher bringen?

split() kenne ich, klar. Mit st[...] wird ein Listenelement aus st herausgelöst. Auch klar.

Aber den Teil zwichen [ ] versteh ich nicht so ganz. Fürchte, dass ich soweit noch nicht war. :?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

No Problem, mache ich gerne.
Also: Strings haben die, meines Erachtens geniale, Möglichkeit Teile direkt rauszulösen, ohne irgendwelche Funktionen nutzen zu müssen, die Slices. Ihre Syntax besteht aus: st[ersteszeichen:letzteszeichen] (vereinfacht, sie haben noch mehr Möglichkeiten, aber das reicht bis jetzt), wobei st der String ist und die beiden Nummern in den Klammern die Nummer des ersten Zeichens und die des letztens Zeichens in dem String ist.

Zur Verdeutlichung ein paar Beispiele:

Code: Alles auswählen

st = 'Hallo'
print st 
# Hallo
print st[1:4] 
# all
print st[1:]
# allo, also der String vom zweiten Buchstaben bis zum Ende
print st[:4]
# Hall, analog ^^
Nun, das reicht, ich will dich jetzt im Moment nicht weiter verunsichern. Hauptsache du verstehst nun die einfachen Slices (die anderen kann ich dir auch erklären, wenn du diese verstanden hast).

Nun weiter im Programm. Wir müssen ja nun ermitteln WO wir anfangen und aufhören müssen zu schneiden. Also fangen wir an zu suchen, wo "Targets" in diesem String anfängt (besser wäre "Targets: ", dann wird nicht das Wort "Targets" durch Zufall vielleicht früher schon gefunden). Das erledigt bei uns .find(). Jetzt noch der Endpunkt, analog dazu mit .rfind(), das den String von hinten/rechts durchsucht, dach dem ersten Vorkommen von "Total Package Size: ".

Also gut, der Code sieht jetzt so aus:

Code: Alles auswählen

st = """:: Replace fam with gaim from "current"? [Y/n] :: Upgrade pacman first? [Y/n]
Remove:  fam

Targets: bootsplash-3.1-8 fontconfig-2.2.3-7 gdm-2.6.0.7-1 ggv-2.8.3-1
         glib2-2.6.2-1 glibc-2.3.4-1 gnome-common-2.8.0-5 gnome-mag-0.11.14-1
         gnome-nettool-1.1.0-1 gamin-0.0.22-1 gnome-vfs-2.8.3-5

Total Package Size:    83.5 MB

Proceed with upgrade? [Y/n]"""

packages = st[st.find('Targets: '):st.rfind('Total Package Size:')]
print packages
und raus kommt:

Code: Alles auswählen

Targets: bootsplash-3.1-8 fontconfig-2.2.3-7 gdm-2.6.0.7-1 ggv-2.8.3-1
         glib2-2.6.2-1 glibc-2.3.4-1 gnome-common-2.8.0-5 gnome-mag-0.11.14-1
         gnome-nettool-1.1.0-1 gamin-0.0.22-1 gnome-vfs-2.8.3-5
Nanu? Wir haben ja noch "Targets: " drinnen? Genau, da wir im Slice ja als Anfangspunkt das erste Vorkommen von "Targets: " angenommen haben. Das ist aber etwas zu früh. So sollten wir erst nach "Targets: " schneiden anfangen, indem wir zum Schnittanfangspunkt noch die Länge von "Targets: " hinzuaddieren.

Also:

Code: Alles auswählen

packages = st[st.find('Targets: ') + len('Targets: '):st.rfind('Total Package Size:')]
print packages
das uns dann ein

Code: Alles auswählen

bootsplash-3.1-8 fontconfig-2.2.3-7 gdm-2.6.0.7-1 ggv-2.8.3-1
         glib2-2.6.2-1 glibc-2.3.4-1 gnome-common-2.8.0-5 gnome-mag-0.11.14-1
         gnome-nettool-1.1.0-1 gamin-0.0.22-1 gnome-vfs-2.8.3-5
bringt.

Nun sind wir fast fertig. Wir wollen ja die einzelnen Pakete haben, deswegen schneiden wir den String an den Whitespaces (Leerzeichen, Tabs usw) mit .split(). Somit bekommen wir eine Liste mit den einzelnen Paketen.

Code: Alles auswählen

packages = st[st.find('Targets: ') + len('Targets: '):st.rfind('Total Package Size:')].split()
print packages
gibt uns dann:

Code: Alles auswählen

['bootsplash-3.1-8', 'fontconfig-2.2.3-7', 'gdm-2.6.0.7-1', 
'ggv-2.8.3-1', 'glib2-2.6.2-1', 'glibc-2.3.4-1', 'gnome-common-2.8.0-5', 
'gnome-mag-0.11.14-1', 'gnome-nettool-1.1.0-1', 'gamin-0.0.22-1', 'gnome-vfs-2.8.3-5']
Bei weiteren Fragen oder bestehenden Unklarheiten, einfach nachfragen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Danke für die Mühe!

Das Stichwort, das mit gefehlt hat waren Slices. Kaum hatte ich das gelsen hab ich das Ganze auch kapiert. :roll:

Da ich bisher keine Slices verwendet habe/verwenden musste, war mir der Syntax für sich wohl kein sofortiger Begriff.

Wieder mal der Beweis. Brauche öfter den richtigen Anstoß. :wink:
Antworten