[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