Python子进程通信杀死了我的进程

时间:2014-02-26 14:56:57

标签: python subprocess communicate

为什么沟通会杀死我的流程?我想要一个交互式流程但是沟通会做一些事情,这样我就不能再在我的流程中使用raw_input了。

from sys import stdin 
from threading import Thread
from time import sleep

if __name__ == '__main__':
    print("Still Running\n")
    x = raw_input()    
    i = 0
    while ('n' not in x ) :
        print("Still Running " + str(i) + " \r\n")
        x = raw_input()
        i += 1

    print("quit")



print(aSubProc.theProcess.communicate('y'))
print(aSubProc.theProcess.communicate('y'))

例外!

self.stdin.write(input)
ValueError: I/O operation on closed file

2 个答案:

答案 0 :(得分:4)

communicate对象的{p> waitPopen方法,在进程返回后关闭PIPE。如果您希望与流程保持沟通,请尝试以下方法:

import subprocess
proc = subprocess.Popen("some_process", stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write("input")
proc.stdout.readline()

答案 1 :(得分:1)

  

为什么沟通会杀死我的流程?

来自Popen.communicate(input=None, timeout=None)的文档:

  

与流程交互:将数据发送到stdin。从stdout和
读取数据   stderr,直到达到文件结尾。 等待进程终止。   强调我的

您只能拨打.communicate()一次。这意味着您应该立即提供所有输入:

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE

p = Popen([sys.executable, 'child.py'], stdin=PIPE, stdout=PIPE)
print p.communicate(os.linesep.join('yyn'))[0]

输出

Still Running

Still Running 0 

Still Running 1 

quit

注意加倍的换行符:一个来自'\r\n',另一个来自print语句本身在子进程的脚本中。

输出显示子进程已成功收到三个输入行('y''y''n')。

以下是使用Python3.4中subprocess.check_output()input参数的类似代码:

#!/usr/bin/env python3.4
import os
import sys
from subprocess import check_output

output = check_output(['python2', 'child.py'], universal_newlines=True,
                      input='\n'.join('yyn'))
print(output, end='')

它产生相同的输出。


如果您想根据子流程的响应提供不同的输入,请使用pexpect模块或其类似物来避免Why not just use a pipe (popen())?中提到的问题