我需要启动一个外部进程,该进程通过stdin和stdout来回发送的消息进行控制.使用subprocess.Popen我能够启动进程但是无法根据需要通过stdin控制执行.
我想要完成的是:
到目前为止,我已经提出了以下建议:
process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE);
for i in xrange(StepsToComplete):
print "Forcing step # %s"%i
process.communicate(input='\n')
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,'\n'不会传递给外部进程,我永远不会超越第0步.代码在process.communicate()处阻塞,不再继续.我错误地使用communic()方法?
另外,我将如何实现"等待外部进程写入新行"功能?
process.communicate(input ='\n')是错误的.如果您将从Python文档中注意到,它会将您的字符串写入子项的stdin,然后读取子项的所有输出,直到子项退出.来自doc.python.org:
Popen.communicate(input = None)与进程交互:将数据发送到stdin.从stdout和stderr读取数据,直到达到文件结尾.等待进程终止.可选的输入参数应该是要发送到子进程的字符串,如果没有数据应该发送给子进程,则应为None.
相反,您只想写入孩子的标准输入.然后在循环中读取它.
更像是:
process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE);
for i in xrange(StepsToComplete):
print "Forcing step # %s"%i
process.stdin.write("\n")
result=process.stdout.readline()
Run Code Online (Sandbox Code Playgroud)
这将做更像你想要的事情.