为什么沟通会杀死我的流程?我想要一个交互式流程但是沟通会做一些事情,这样我就不能再在我的流程中使用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
答案 0 :(得分:4)
communicate
对象的{p> wait
和Popen
方法,在进程返回后关闭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())?中提到的问题