开始,并通过标准输入/输出与Python控制外部过程(Starting and Controllin

2019-09-17 17:57发布

我需要启动外部过程,是通过通过stdin和stdout来回发送消息进行控制。 使用subprocess.Popen我能够启动这一进程,但我不能,因为我需要控制通过stdin执行。

什么我试图完成的流程是:

  1. 启动外部进程
  2. 迭代对于一些数量的步骤
    1. 告诉外部进程通过写一个新行字符到它的标准输入,完成一个处理步骤
    2. 等待外部进程通过写一个新行字符,以表示它已经完成了一步到它的标准输出
  3. 关闭外部进程的标准输入以指示执行已完成外部进程。

我想出了迄今为止以下几点:

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码块(),并且不进一步进行任何。 我使用不当通信()方法?

此外,我将如何实现了“等待外部进程写入新行”片的功能?

Answer 1:

process.communicate(输入= '\ n')是错误的。 如果您将Python文档注意到,写入您的字符串到孩子的标准输入,然后读取从孩子的所有输出,直到孩子退出。 从doc.python.org:

Popen.communicate(输入=无)与进程交互:发送数据到标准输入。 阅读从stdout和stderr数据,达到-的文件结束到。 等待进程终止。 可选的输入参数应该是一个字符串发送给子进程,或无,如果没有数据要发送到的孩子。

相反,你要只写孩子的标准输入。 然后从它在你的循环中读取。

更多的东西一样:

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()

这将做更多的东西一样,你想要什么。



Answer 2:

你可以使用双绞线,用reactor.spawnProcess和LineReceiver 。



文章来源: Starting and Controlling an External Process via STDIN/STDOUT with Python