[Python-de] Pipes
Marcus Habermehl
bmh1980de at yahoo.de
Son Apr 10 19:57:11 CEST 2005
Hallo.
Nach dem ich jetzt das ganze Wochenende weiter herumexperimentiert habe,
hab ich eine Lösung gefunden. :)
Auch, wenn es jetzt doch nichts mit einer Pipe zu tun hat, hier mal
meine gefundene Lösung:
def ausfuehren():
child = pexpect.spawn('find /usr -type d')
while gtk.events_pending():
gtk.main_iteration()
line = child.readline()
while line:
while gtk.events_pending():
gtk.main_iteration()
tbuffer1.insert_at_cursor(line)
tview1.scroll_to_mark(tbmark1, 0.05, True, 0.0, 1.0)
line = child.readline()
Oder einfach gesagt: Mit pexpect funktioniert das Ganze so, wie ich es
mir vorgestellt habe. Auch wenn ich jetzt nach zwei Wochen freiwillig in
die Geschlossene gehen würde. ;)
Gruß
Marcus
Marcus Habermehl schrieb:
> Georg Mischler schrieb:
>
>> Marcus Habermehl wrote:
>>
>>> Wenn ein Button in meinem GUI angeklickt wird, soll sich ein Fenster
>>> mit
>>> einem TextView öffnen, in dem man die Ausgabe eines gleichzeitig
>>> gestarteten Befehls sehen kann.
>>>
>>> In etwa so, wie ich unten mal aufgeführt habe. 'find /usr -type l' ist
>>> da nur ein Beispiel. Kann auch ein anderer Befehl sein. Bleibt aber
>>> dennoch ein "externer" Befehl. Dazu kommt, dass die Ausgabe erst _nach_
>>> Beendigung des Befehls eingefügt wird. Ich hätte es aber gerne
>>> zeitgleich im TextView.
>>
>>
>> Seit Python 2.4 gibt es das Standard-Modul "subprocess", welches
>> genau solche Kommunikationsaufgaben erledigt. Funktioniert aber
>> auch mit älteren Versionen. Google ist dein Freund.
>>
> Google ist in der Hinsicht nicht mein Freund. Auf subprocess bin ich
> auch schon durch Suchen gekommen.
>
> Aber ehrlich gesagt bin ich wohl zu blöd dafür. Ich hab die Anwendung
> des Moduls überhaupt nicht verstanden. :(
>
> Ich habe ausfuehren() mal so abgeändert:
>
> def ausfuehren():
> while gtk.events_pending():
> gtk.main_iteration()
> for line in subprocess.Popen(['find', '/usr', '-type', 'l'],
> stdout=subprocess.PIPE).communicate():
> if line != '' and line != None:
> tbuffer1.insert_at_cursor(line)
>
> Funktionieren tut das ja. Aber auch leider nicht mit der echtzeit
> Übertragung an den TextBuffer.
>
> Eigentlich hatte ich mir das so überlegt, dass ich eine Pipe
> (irgendwie) erstelle, diese mit gobject.io_add_watch() überwache und
> die Änderungen dann auch (irgendwie) an den TextBuffer übertrage.
>
> Allerdings scheint mein Verständnis da nicht ganz mitzuspielen, bzw.
> zu reichen. :(
>
> Gruß
> Marcus