7

私は単純な echoprocess.py を持っています:

import sys

while True:
    data = sys.stdin.read()
    sys.stdout.write("Here is the data: " + str(data))

そしてparentprocess.py

from subprocess import Popen, PIPE

proc = Popen(["C:/python27/python.exe", "echoprocess.py"],
             stdin = PIPE,
             sdtout = PIPE)

proc.stdin.write("hello")
print proc.stdout.read()

これは、echoprocess.py が終了するまでハングします。このサブプロセスを再起動せずに複数回通信したい。この種のプロセス間通信は、Windows の Python サブプロセス モジュールで可能ですか?

4

1 に答える 1

6

一番の問題はライン...

print proc.stdout.read()

パラメータを指定せずにread()メソッドを使用すると、EOF まですべてのデータが読み取られますが、EOF はサブプロセスが終了するまで発生しません。

おそらく行ごとの読み取りで問題ないので、次を使用できます...

proc.stdin.write("hello\n")
print proc.stdout.readline()

...それ以外の場合は、「メッセージ」を区切る他の方法を考え出す必要があります。

に同様の変更を加える必要があります。echoprocess.pyつまり、変更...

data = sys.stdin.read()

...に...

data = sys.stdin.readline()

出力バッファリングにも問題がある可能性があるためflush()、書き込みを行った後にバッファリングが必要になる場合があります。


これらすべてをまとめると、次のように変更echoprocess.pyすると...

import sys

while True:
    data = sys.stdin.readline()
    sys.stdout.write("Here is the data: " + str(data))
    sys.stdout.flush()

...そしてparentprocess.py...

from subprocess import Popen, PIPE

proc = Popen(["C:/python27/python.exe", "echoprocess.py"],
             stdin = PIPE,
             stdout = PIPE)

proc.stdin.write("hello\n")
proc.stdin.flush()
print proc.stdout.readline()

...期待どおりに動作するはずです。

于 2013-05-16T16:39:15.307 に答える