2012-04-12 12 views
3

私はサブプロセスのモジュールについて学びたいので、hldsサーバーの管理者にしています。Popenのサブプロセスの問題

私の目標は、サーバインスタンスを起動し、すべてのコマンドをdispatcher.pyで送信して複数のサーバを管理できるようにすることです。サブプロセスstdinにコマンドを送信します。私はいくつかの初期テストのために、これまで持っているが、すでに捕まってしまったものを

:]

#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') 

私はHLDSサーバから任意の標準出力を取得していないが、私はstdoutに設定していけない場合、それは正常に動作しますパイプ。 hlds.communicate('quit')は、hldsプロセスのstdinに送信されていないようです。 ls -lコマンドはstdoutを正しく返しますが、hldは返しません。

すべてのお役に立ちました! :)

答えて

3

Popen.communicate docs(強調鉱山)を参照してください:

のインターアクトプロセスで:標準入力にデータを送信します。ファイルの終わりに達するまで、stdoutとstderrからデータを読み込みます。 プロセスが終了するまで待つ。オプションの入力引数は、子プロセスに送信する文字列である必要があります。子に送信するデータがない場合はNoneです。プロセスを終了することが待っているので

だからのみ、プロセスの実行あたり一度communicateを呼び出すことができます。だからls -lがうまくいくようです - それはすぐに終了し、hldsは終了しません。

あなたは何をする必要があるでしょう:

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

あなたはそれが終了するまでquitに送信し、すべての出力を取得したい場合。

さらにインタラクティブ機能が必要な場合は、hlds.stdout, hlds.stdin, and hlds.stderrを直接使用する必要があります。

関連する問題