我需要启动一个外部流程,该过程将通过STDIN和STDOUT来回发送的消息来控制。使用subprocess.popen我能够启动该过程,但无法按照我的需求控制通过stdin的执行。

我要完成的目的是:

  1. 开始外部过程
  2. 迭代一些步骤
    1. 告诉外部过程通过为其stdin编写新线字符来完成下一个处理步骤
    2. 等待外部进程发出信号,通过为其stdout编写新线字符来完成步骤
  3. 关闭外部进程的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()

这将做更多类似于您想要的事情。

其他提示

您可以使用扭曲 反应器。SpawnProcessLineceiver.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top