2014-04-15 70 views
0

我一直(不成功)尝试使用Python的subprocess模块与可执行程序进行交互。该程序是一个非常简单的基于命令行的脚本。使用子进程读取和写入进程

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

所以我成立了像这样

子进程
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() 

但它仍然挂起不管什么。

做这一行读/写业务的正确方法是什么?我一定在搞搞我想的write系列。

回答

2

你可能忘记输出一个换行符:

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

什么情况是,你的子流程接收数据,而是在等待更多的输入,直到它找到一个换行符。如果您在此状态下等待进程的输出,则会导致系统死锁。

+0

现在我觉得很蠢。我要去喝更多的咖啡。谢谢! – CoryKramer

+0

@Cyber​​:不要觉得自己很愚蠢。如果直接使用阻塞“p.stdin/p.stdout”,死锁非常容易。 '\ n'可能不够;你可能需要'os.linesep',否则你可能需要'p.stdin.flush()'。明确地为'Popen'设置'bufsize'。它在不同的Python版本上有不同的默认值。另外,你怎么知道'p.stdout.readline()'就够了。如果答案是两行呢?理想情况下,如果可以,则使用'p.communicate(input)',即输入不依赖于输出。子过程也可以在stdout/stderr之外写入,例如直接写入终端。你可以使用'pexpect'。 – jfs