题
我需要启动一个外部流程,该过程将通过STDIN和STDOUT来回发送的消息来控制。使用subprocess.popen我能够启动该过程,但无法按照我的需求控制通过stdin的执行。
我要完成的目的是:
- 开始外部过程
- 迭代一些步骤
- 告诉外部过程通过为其stdin编写新线字符来完成下一个处理步骤
- 等待外部进程发出信号,通过为其stdout编写新线字符来完成步骤
- 关闭外部进程的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')
当我运行上述代码时,“ n”不会传达到外部进程,我永远不会超越步骤#0。 process.communicate()中的代码块,并且不会进一步进行。我错误地使用了通信方法吗?
我还将如何实施“等待外部流程编写新行”功能?
解决方案
process.communicate(输入=' n')是错误的。如果您会从Python文档中注意到,它将您的字符串写入孩子的Stdin,然后从孩子那里读取所有输出,直到孩子退出。来自doc.python.org:
popen.communicate(input = none)与进程交互:将数据发送到stdin。从Stdout和STDERR中读取数据,直到达到文件终止。等待过程终止。可选的输入参数应为要将其发送到子进程的字符串,或者如果不应将数据发送给儿童,则应无需发送。
相反,您只想写信给孩子的stdin。然后从您的循环中阅读。
更像:
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()
这将做更多类似于您想要的事情。
其他提示
您可以使用扭曲 反应器。SpawnProcess 和 Lineceiver.
不隶属于 StackOverflow