process.stdout.readline() 挂起.如何正确使用? [英] process.stdout.readline() hangs. How to use it properly?
问题描述
我想重复发送处理标准输入的请求并接收来自标准输出的响应多次调用 subprocess
.我可以使用 p.communicate
实现一次性请求-响应迭代,但不要多次调用 subprocess
我需要使用:process.stdout.readline()
挂起.如何正确使用?我使用 Python 2.7 64 位,Windows 7.提前致谢.
I want to repeatedly send requests to process standard input and receive responses from standard output without calling subprocess
multiple times. I can achieve a one-time request-response iteration using p.communicate
however not to call the subprocess
multiple times I need to use: process.stdout.readline()
which hangs. How to use it properly?
I use Python 2.7 64 bit, Windows 7. Thanks in advance.
main.py
:
import subprocess
p = subprocess.Popen(['python','subproc.py'],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
while True:
s=raw_input('Enter message:')
p.stdin.write(s)
p.stdin.flush()
response = p.stdout.readline()
if response!= '':
print "Process response:", response
else:
break
subproc.py
:
from __future__ import division
import pyximport
s=raw_input()
print 'Input=',s
推荐答案
您可以进行一些小调整以使其正常工作.首先是使用 -u
选项禁用子进程中的缓冲输出.其次是将换行符连同用户输入的消息一起发送到子进程,以便子进程中的 raw_input
调用完成.
There are a couple of minor tweaks you can make to get this working. First is to disable buffered output in the child using the -u
option. Second is to send a newline character along with the user-inputted message to the child process, so that the raw_input
call in the child completes.
main.py
import subprocess
# We use the -u option to tell Python to use unbuffered output
p = subprocess.Popen(['python','-u', 'subproc.py'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
while True:
s = raw_input('Enter message:')
p.stdin.write(s + "\n") # Include '\n'
p.stdin.flush()
response = p.stdout.readline()
if response != '':
print "Process response:", response
else:
break
您还应该将子进程包装在一个无限循环中,否则在发送第一条消息后事情就会中断:
You should also wrap the child process in an infinite loop, or things will break after the first message is sent:
subproc.py
:
while True:
s = raw_input()
print 'Input=',s
输出:
dan@dantop:~$ ./main.py
Enter message:asdf
Process response: Input= asdf
Enter message:asdf
Process response: Input= asdf
Enter message:blah blah
Process response: Input= blah blah
Enter message:ok
Process response: Input= ok
这篇关于process.stdout.readline() 挂起.如何正确使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!