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

Peter Funk pf at artcom0.north.de
Thu May 27 14:13:28 EDT 1999


Hallo Uwe!  Hallo "Liste"!

Nachdem auf Uwes Frage bis jetzt nur eine halbwegs konstruktive
Antwort kam, versuche ich es mal.

Uwe Hentzschel schrieb:
[...]
> Das auszuführende Programm liesst von stdin und schreibt auf stdout.
> 
> Die Ausgabe lese ich mit:
> cmd = '/home/uhe/Sap/run'
> result = os.popen(cmd).readlines()
> 
> Nur wie schreibe ich auf stdin als Eingabe für das externe Programm.

Wenn es nicht so auf optimale Performance ankommt, ist es hier
am sichersten, eine Temporär-Datei zu benutzen: 

  tempname = '/tmp/myinut.%d' % os.getpid()
  open(tempname, "w").write(input)
  cmd = '/home/uhe/Sap/run < ' + tempname + '; rm -f ' + tempname
  result = os.popen(cmd).readlines()

Prinzipiell wäre es zwar auch möglich, zwei Pipelines zu benutzen, aber
diese Art der Kommunikation ist unter Unix ein wenig problematisch, da
sie anfällig für einen sogenannten "Dead lock" ist.  Dieses Problem
ist dabei unabhängig von der verwendeten Programmiersprache.
(siehe z.B. auch W.Richard Stevens: Unix Network Programming, 
ISBN 0-13-949876-1)

Es kann nämlich z.B. folgendes passieren:  Das aufrufende Programm
(in diesem Fall das Python-Programm) versucht erst alle Daten
in die Pipe an das Hilfsprogramm zu schreiben,  dieses fängt 
an zu arbeiten, schreibt aber schon Ausgabedaten, bevor es die
Eingabe komplett gelessen hat und schon stehen beide Prozesse
in einem 'write' oder 'read' auf der jeweils anderen Pipe und
warten bis zum St.Nimmerleinstag darauf, daß der jeweils andere
Prozess weitere Daten liest bzw. schreibt.

Damit es nicht zu so einer  Deadlock-Situation kommen kann, müssen
beide Programme ein genau abgestimmtes Kommunikations-Protokoll
einhalten.  Nur dann bietet sich die Verwendung des Moduls 'popen2' an.

Gruß, Peter
-- 
Peter Funk, Oldenburger Str.86, 27777 Ganderkesee, Tel: 04222 9502 70, Fax: -60




More information about the Python-de mailing list