[Python-de] "popen" liesst von stdin ?

Georg Mischler G.Mischler at hl-technik.de
Mon May 31 15:31:30 EDT 1999


> Die Gedanken hinter 'select' und damit die Benutzung dieses
Moduls
> ist aber auch nicht gerade für jedermann geeignet. 
Andererseits
> kann mit Hilfe von 'select' natürlich der Zwang zur Einhaltung
> eines bestimmten Handshake-Protokoll bei der Reihenfolge der
Read- und
> Write-Aufrufe auf allgemein gültige Art und Weise vermieden
werden.
> 
> Es wäre doch jetzt hübsch, wenn es aufbauend auf 'popen2' und
'select'
> einen Library-Modul namens 'filter' oder so ähnlich gäbe, der
die
> unschönen Details zur Deadlock-Vermeidung vor dem
Anwendungsprogrammer
> verstecken würde.  Gibt es das vielleicht sogar schon?
> Das wäre eigentlich genau das, wonach ursprünglich gefragt
wurde.

Seit Python 1.5.2 sind Sam Rushings Async-Module in der
Standard-Library
enthalten (asyncore.py und asynchat.py). Diese tun (fast) alles,
was zu
diesem  Zweck notwendig ist. Dazu kann man unter Unix das Modul
Process2.py von  Tod Olson verwenden, um den Prozess zu starten
und die
gewuenschten Pipes dranzuhaengen. Das Modul beherrscht auch
Umleitungen wie eine Shell (<, <<, >, >>, etc.), wobei der
Aufruf einer Shell
tatsaechlich vermieden wird, um Resourcen zu sparen.
  
http://www.lib.uchicago.edu/~tao/software/libraries/Process2.py

Ganz prinzipiell kann man das auch sehr einfach mit popen2()
loesen,
aber man verliert dann natuerlich die Kotrollmoeglichkeiten, um
den
Prozess anzuhalten, wieder anzuschieben, abzuschiessen etc.

Ein Problem hinter der Geschichte ist natuerlich (zumindest fuer
einige),
dass das alles unter Windows nicht direkt funktioniert. Erstens
kann der
select()-Aufruf dort nur auf Sockets angewendet werden, und
nicht auf
Dateien und Pipes. Zweitens basiert Process.py auf fork() und
execve(),
wovon zumindest das erstere unter Windows gar nicht erst
existiert.

Ich habe fuer meine eigenen Zwecke selber mal eine sehr viel
einfachere
Variante von Process.py geschrieben, und bin im Moment gerade
dabei,
diese mit Hilfe von Mark Hammonds win32-Extensions auf NT zu
portieren. Die Module koennte ich eventuell auch zur Verfuegung
stellen, allerdings fruehenstens in ein paar Wochen, wenn ich
einen
besseren Ueberblick habe, ob sie auch korrekt funktionieren.

Das Select-Problem ist damit allerdings unter NT noch nicht
geloest.
Ganz allgemein laesst sich sagen, dass man es hier nicht einfach
mit
ein paar Modulen zu tun hat, aus welchen man sich ne Klasse oder
zwei raussucht und weiterverwendet. Den Einsatz solcher Mittel
muss
man sich eher so vorstellen, dass man die Komponenten eines
(wenn
auch einfachen) Application-Frameworks vor sich hat, welche man
zu einer angemessenen Programmstruktur zusammenschrauben muss.

Wir geraten hier in die Event-gesteuerte Programmierung hinein,
welche ihre eigenen Fallstricke hat. Wer das Ganze dann noch mit
Tkinter kombinieren will, der muss auch dessen Mainloop
ersetzen, 
und sich um alle anfallenden Haushaltsarbeiten selber kuemmern.
Auf der Habenseite ist so eine Loesung natuerlich aeusserst
flexibel,
denn wenn ich schon mal mein eigenes Mainloop habe, dann kann
ich da noch viele anderen Automatismen zusaetzlich einbauen
(Stichwort Animationen, etc...). Ach ja, und Deadlocks koennen
natuerlich immer noch auftreten, nur auf einer hoeheren Stufe.
Um diese  einigermassen zuverlaessig zu  vermeiden ist die
Implementation eines kleinen Status-Automaten empfehlenswert. 
Nuff said.

Das alles ist durchaus machbar, und ich habe es zu meinem
eigenen
Erstaunen auch selber hingekriegt. Etwas Sitzfleisch muss man
aber
schon aufbringen, bis man alle involvierten Konzepte verstanden
hat.
Ob das jetzt ermutigend oder abschreckend klingt, muss jeder
fuer
sich selber entscheiden...


Viel Spass!

-schorsch




More information about the Python-de mailing list