【问题标题】:Starting and Controlling an External Process via STDIN/STDOUT with Python使用 Python 通过 STDIN/STDOUT 启动和控制外部进程
【发布时间】:2009-07-06 16:03:57
【问题描述】:

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

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

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

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

    Popen.communicate(input=None) 交互 带进程:将数据发送到标准输入。读 来自 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()
    

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

    【讨论】:

    • 当我第一次这样做时,让我很不爽的是,如果您只发送几个字符,您可能必须在传输任何内容之前刷新流。
    【解决方案2】:

    您可以使用 Twisted,通过使用 reactor.spawnProcessLineReceiver

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2021-06-02
      • 2011-08-01
      • 2014-02-14
      • 1970-01-01
      • 2017-04-16
      相关资源
      最近更新 更多