2009-07-06 57 views
4

我需要启动一个外部进程,通过stdin和stdout来回发送消息来控制它。使用subprocess.Popen我能够启动该进程,但无法通过stdin控制执行,因为我需要。使用Python通过STDIN/STDOUT启动和控制外部进程

的我想要完成的流程是:

  1. 启动外部进程
  2. 迭代对于一些数量的步骤
    1. 告诉外部程序来完成下一个处理通过在它的stdin中写一个换行符
    2. 等待外部进程通过向它的stdout写入换行符来完成该步骤
  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()中的代码块不会继续进行。我正在使用communications()方法吗?

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

回答

8

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

Popen.communicate(input = None)与进程交互 :将数据发送到stdin。从stdout和stderr读取 数据,直到达到 文件结束。等待 进程终止。可选的 输入参数应该是一个字符串,将 发送给子进程,如果没有数据应该发送给 子进程,则返回None, 。

取而代之,你想只写信给孩子的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() 

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

+3

当我第一次这样做的时候,有些东西会让我咬牙切齿,如果你只发送几个字符,你可能不得不在发送任何东西之前刷新流。 – Kiv 2009-07-06 16:20:57

相关问题