Python 2.7 Python子进程.stdout.readline()挂起

Python 2.7 Python子进程.stdout.readline()挂起,python-2.7,subprocess,Python 2.7,Subprocess,我尝试在python上使用subprocess编写简单代码,调用process.stdout.readline时,它将挂起。如何解决这个问题?在输出中尝试使用fcntl作为非块时,我得到了空白输出 我的源代码: from subprocess import Popen,PIPE import fcntl import os proc = Popen(['./test'],stdin=PIPE,stdout=PIPE) fcntl.fcntl(proc.stdout.fileno(), f

我尝试在python上使用subprocess编写简单代码,调用process.stdout.readline时,它将挂起。如何解决这个问题?在输出中尝试使用fcntl作为非块时,我得到了空白输出

我的源代码:

from subprocess import Popen,PIPE 
import fcntl
import os

proc = Popen(['./test'],stdin=PIPE,stdout=PIPE) 

fcntl.fcntl(proc.stdout.fileno(), fcntl.F_SETFL, os.O_NONBLOCK)

print "Started!"

print proc.stdout.readline()

proc.stdin.write('5\n')
proc.stdin.flush()

print proc.stdout.readline()

proc.stdin.write('5\n')
proc.stdin.flush()


print proc.stdout.readline()
proc.stdout.close()
proc.stdin.close()
输出应如下所示:

First number: 5
Second number: 5
Answer: 10

所需的输出表明,在第一个数字之后没有换行符:因此,在proc.stdin.write'5\n'行之前的阻塞proc.stdout.readline调用将挂起,并且非阻塞变量不会通过TestRing返回任何空值-还没有要返回的换行符/EOF

要修复此问题,可以在冒号“:”处的提示末尾停止读取。看

即使提示后有换行符;由于缓冲问题,readline可能会挂起。看

例如,如果测试等同于:

#!/usr/bin/env python3
a = int(input('First number: '))
b = int(input('Second number: '))
print('Answer:', a + b)
然后,要获得答案,您可以使用:

如果您想同时查看输入和输出;您可以设置logfile=sys.stdout参数

#!/usr/bin/env python
import pexpect # $ pip install pexpect

def print_result(locals):
    result = int(locals['child'].after.rpartition(b' ')[2])
    print(result)

pexpect.run('./test', events={'First number': '5\n', 'Second number': '5\n',
                              r'Answer:\s*\d+': print_result})