Externe Ausgabe -> ListStore

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

Externe Ausgabe -> ListStore

Beitragvon bmh1980 » Montag 7. Februar 2005, 18:57

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?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 7. Februar 2005, 19:27

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

Beitragvon bmh1980 » Montag 7. Februar 2005, 19:36

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:
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 7. Februar 2005, 19:40

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: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 7. Februar 2005, 20:10

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 Modvoice
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Beitragvon bmh1980 » Montag 7. Februar 2005, 20:22

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. :?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 7. Februar 2005, 20:47

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 Modvoice
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Beitragvon bmh1980 » Freitag 11. Februar 2005, 18:54

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:

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder