[Python-de] Pipes

Marcus Habermehl bmh1980de at yahoo.de
Fre Apr 8 19:34:22 CEST 2005


Thilo Ernst schrieb:

> Hallo Marcus,
>
> Schreib zunächst mal, was genau (beispielhaft) in der Pipe passieren 
> soll ("eine Funktion"?), das macht es leichter.
> Am besten macht sich stets ein Stück Sourcecode...
>
> Betreibst Du überhaupt mehrere Prozesse? Falls nicht (wenn Du nur 
> zwischen unterschiedlichen Threads
> in einem Prozess kommunizieren willst), brauchst Du keine Pipes, 
> sondern Queues (siehe Standardlibrary).

[...]

Okay. Ich versuch das mal verständlich rüber zu bringen (kann das nicht 
so gut :( ).

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.

Mittlerweile habe ich so viele Beiträge dazu gelesen, und teilweise 
selber verfasst, dass ich zeitweise wirklich schon Kopfschmerzen vom 
Lesen und Auf-den-Bildschirm-Starren hatte.

Ein weiteres Problem was ich habe, sind die teilweise völlig 
unterschiedlichen Ansätze. Oder bei Artikeln im Netz, dass sie zu alt 
waren und die Funkionen, die für PyGTK angesprochen wurden, nicht mehr 
in der Form zur Verfügung stehen.

Die Ansätze gehen von PyGTK eigene Funktionen, über Pipes zu Threads. 
Irgendwann hab ich dann gar nüchts mehr verstanden. :( Und irgendwie 
nach erneutem Kopfzerbrechen war ich der Meinung, dass eine Pipe des 
Rätsels Lösung sein könnte. Ohne gleich ein halbes Terminal zu schreiben.

Auch wenn die Idee gut ist, für das Ziel finde ich sie zu überdimensional.

Aber hier jetzt mein Beispiel.

#! /usr/bin/python

import gtk, os

def ausfuehren():
    for line in os.popen('find /usr -type l').readlines():
        tbuffer.insert_at_cursor(line)

window = gtk.Window()
window.connect('destroy', lambda window: gtk.main_quit())

vbox = gtk.VBox()

scwin = gtk.ScrolledWindow()
scwin.set_size_request(300, 300)
vbox.add(scwin)

tview = gtk.TextView()
scwin.add(tview)

tbuffer = tview.get_buffer()

hbox = gtk.HBox()

button1 = gtk.Button()
button1.set_label('gtk-quit')
button1.set_use_stock(True)
button1.connect('clicked', lambda button1: gtk.main_quit())
hbox.add(button1)

button2 = gtk.Button()
button2.set_label('gtk-execute')
button2.set_use_stock(True)
button2.connect('clicked', lambda button2: ausfuehren())
hbox.add(button2)

Gruß
Marcus