[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