6

我需要启动一个外部进程,该进程将通过标准输入和标准输出来回发送的消息进行控制。使用 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() 处阻塞,不再继续。我错误地使用了communicate() 方法?

另外,我将如何实现“等到外部进程写入新行”的功能?

4

2 回答 2

9

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

Popen.communicate(input=None) 与进程交互:向标准输入发送数据。从 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()

这将做一些更像你想要的事情。

于 2009-07-06T16:18:06.507 回答
0

您可以通过使用reactor.spawnProcessLineReceiver来使用 Twisted 。

于 2009-07-09T11:29:37.440 回答