2

为什么通信会杀死我的进程?我想要一个交互式过程,但通信会做一些事情,这样我就不能再在我的过程中使用 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
4

2 回答 2

4

communicatewait方法的Popen对象,PIPE在进程返回后关闭。如果您想与流程保持联系,请尝试以下操作:

import subprocess
proc = subprocess.Popen("some_process", stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write("input")
proc.stdout.readline()
于 2014-02-26T15:03:15.643 回答
1

为什么通信会杀死我的进程?

从文档中Popen.communicate(input=None, timeout=None)

与进程交互:将数据发送到标准输入。从 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

注意加倍的换行符:子进程脚本中的一个 from'\r\n'和另一个 fromprint语句本身。

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

subprocess.check_output()这是使用 Python3.4 中的 '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模块或其类似物来避免为什么不只使用管道 (popen()) 中提到的问题?

于 2014-03-04T21:22:45.490 回答