2012-04-12 8 views
3

Ich versuche, über das Subprocessing-Modul zu lernen und mache daher einen HLDs-Server-Administrator.Popen Subprocessing Probleme

Mein Ziel ist es, Server-Instanzen zu starten und alle Befehle über dispatcher.py zu senden, um mehrere Server zu verwalten, z. Senden Sie Befehle an Unterprozesse stdin.

, was ich für einige erste Tests so weit gekommen, wurde aber bereits fest:]

#dispatcher.py 
import subprocess 

RUN = '/home/daniel/hlds/hlds_run -game cstrike -map de_dust2 -maxplayers 11' 
#RUN = "ls -l" 

hlds = subprocess.Popen(RUN.split(), stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 

print hlds.communicate()[0] 

print hlds.communicate()[1] 

hlds.communicate('quit') 

Ich bin kein stdout vom hlds Server bekommen, aber es funktioniert gut, wenn ich stdout gesetzt dont ROHR. Und die hlds.communicate('quit') scheint auch nicht an die HLDs-Prozess-Anweisung gesendet zu werden. Der Befehl ls -l gibt stdout korrekt, aber nicht hlds zurück.

Alle Hilfe geschätzt! :)

Antwort

3

Siehe Popen.communicate docs (Hervorhebung von mir):

Interact mit Prozess: Daten zu stdin senden. Lies Daten von stdout und stderr, bis das Dateiende erreicht ist. Warten, bis der Prozess beendet ist. Das optionale Eingabeargument sollte eine Zeichenfolge sein, die an den untergeordneten Prozess gesendet wird, oder Keine, wenn keine Daten an das untergeordnete Element gesendet werden sollen.

So können Sie nur communicateeinmal pro Lauf eines Prozesses aufrufen, da sie wartet auf den Prozess zu beenden. Deshalb scheint ls -l zu funktionieren - es endet sofort, während hlds nicht funktioniert.

Sie müssen tun:

out, error = hlds.communicate('quit') 

, wenn Sie in quit und bekommen alle Ausgaben gesendet werden sollen, bis es beendet wird. Wenn Sie mehr Interaktivität benötigen, müssen Sie direkt hlds.stdout, hlds.stdin, and hlds.stderr verwenden.