使用Python中的子进程多次通信

时间:2016-10-06 14:45:45

标签: python ipc

这个问题不是

的重复

Communicate multiple times with a process without breaking the pipe?

这个问题已经解决,因为它的用例允许将输入一起发送,但如果您的程序是交互式的(如此处的用例所示),则不是这样。

文件subprocess.Popen说:

communicate(input=None)
    Interact with process: Send data to stdin.  Read data from stdout
    and stderr, until end-of-file is reached.  Wait for process to
    terminate.  ...

是否可以在终止之前与子进程多次通信,如终端或网络套接字?

例如,如果子流程为bc,则父流程可能希望根据需要向其发送不同的输入以进行计算。由于发送到bc的输入可能取决于用户输入,因此无法一次发送所有输入。

2 个答案:

答案 0 :(得分:1)

基本Non-blocking read on a subprocess.PIPE in python

通过fnctl将proc管道(proc.stdout,proc.stdin,...)设置为非阻塞模式,然后直接写入/读取它们。

您可能希望使用epoll或通过selectio模块进行选择,以提高效率。

答案 1 :(得分:1)

事实并非如此:

proc = subprocess.Popen(['bc'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
os.write(proc.stdin.fileno(), b'100+200\n')
print(os.read(proc.stdout.fileno(), 4096))