Python 使用子进程读取和写入进程

Python 使用子进程读取和写入进程,python,io,subprocess,Python,Io,Subprocess,我一直在(未成功)尝试使用Python的子流程模块与可执行程序交互。该程序是一个非常简单的基于命令行的脚本 它基本上只是按照以下方式操作:用文本提示用户,等待数字输入,用更多文本提示,等待下一次输入,等等 所以我像这样设置子流程 from subprocess import Popen, PIPE p = Popen('filename.exe', stdin=PIPE, stdout=PIPE) 然后我得到第一个提示 print p.stdout.readline() 正确返回 输入一些值

我一直在(未成功)尝试使用Python的
子流程
模块与可执行程序交互。该程序是一个非常简单的基于命令行的脚本

它基本上只是按照以下方式操作:用文本提示用户,等待数字输入,用更多文本提示,等待下一次输入,等等

所以我像这样设置子流程

from subprocess import Popen, PIPE
p = Popen('filename.exe', stdin=PIPE, stdout=PIPE)
然后我得到第一个提示

print p.stdout.readline()
正确返回

输入一些值等等

太好了!然后我尝试输入所需的值

p.stdin.write('10.0')
然后它就完全挂起了。我可以试着抓住下一个提示

print p.stdout.readline()
但无论如何,它仍然挂着


做这一行读/写业务的正确方法是什么?我想我一定是弄乱了
行。

你可能忘了输出新行:

p.stdin.write('10.0\n')

发生的情况是,您的子流程正在接收数据,但等待更多的输入,直到找到换行符。如果在此状态下等待进程的输出,则会使系统死锁

@Cyber:别觉得自己愚蠢。如果直接使用blocking
p.stdin/p.stdout
,很容易死锁<代码>\n
可能不够;您可能需要
os.linesep
,或者您可能需要
p.stdin.flush()
。为
Popen
明确设置
bufsize
。它在不同的Python版本上有不同的默认值。另外,您如何知道
p.stdout.readline()
就足够了。如果答案是两行呢?理想情况下,如果可以,即当输入不依赖于输出时,使用
p.communication(input)
。子进程也可以在stdout/stderr之外写入,例如直接写入终端。您可以使用
pexpect