与子进程通信,而无需等待子进程在Windows上终止

Mic*_*son 6 python stdin subprocess stdout readline

我有一个简单的echoprocess.py:

import sys

while True:
    data = sys.stdin.read()
    sys.stdout.write("Here is the data: " + str(data))
Run Code Online (Sandbox Code Playgroud)

还有一个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()
Run Code Online (Sandbox Code Playgroud)

这只是挂起,直到echoprocess.py终止。我想多次与此子进程通信,而不必再次重新启动它。Windows上的Python子进程模块可以进行这种进程间通信吗?

Aya*_*Aya 5

主要问题是生产线...

print proc.stdout.read()
Run Code Online (Sandbox Code Playgroud)

read()方法在不带参数的情况下将读取所有数据,直到EOF,直到子进程终止,该数据才会出现。

您可能会逐行阅读,所以可以使用...

proc.stdin.write("hello\n")
print proc.stdout.readline()
Run Code Online (Sandbox Code Playgroud)

...否则,您将不得不找出一些其他方法来界定“消息”。

您必须对进行类似的更改echoprocess.py,即更改...

data = sys.stdin.read()
Run Code Online (Sandbox Code Playgroud)

...至...

data = sys.stdin.readline()
Run Code Online (Sandbox Code Playgroud)

您还可能在输出缓冲方面flush()遇到问题,因此在执行写操作后可能需要对缓冲区进行缓冲。


综合考虑所有这些,如果您更改echoprocess.py为...

import sys

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

...并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()
Run Code Online (Sandbox Code Playgroud)

...它应该按照您期望的方式工作。