【问题标题】:Pipe-lining two python programs流水线化两个 Python 程序
【发布时间】:2012-07-14 12:23:09
【问题描述】:

我知道在这里发布了类似的问题,但我的代码无法正常工作。 我想将一个 python 程序输出通过管道传输到其他程序的输入。等待输入的是 raw_input('>')

我要运行的代码是:

import subprocess
gen = subprocess.Popen(['python', 'first.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
start = subprocess.Popen(['python','second.py'], stdin=gen.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
start.communicate()

first.py:

try:
    while(1):
        print gen()
        time.sleep(1)
except KeyboardInterrupt:
    sys.exit(1)

输出不会产生任何东西

有什么建议吗?

【问题讨论】:

标签: python subprocess pipe


【解决方案1】:

你完整的 second.py 是什么样的?即使它应该与 raw_input() 一起使用,您是否尝试过从 sys.stdin 读取?您显示的代码 sn-p 看起来不错,因为它对我有用。

另一个可能的问题是,随着程序继续执行,您的 first.py 永远不会完成。除非第一个子进程命令完成,否则不会执行第二个子进程命令。所以试试你的 first.py 没有无限循环。让它停下来,然后尝试,也许你的管道会起作用。

【讨论】:

  • try: while(1): word = raw_input('>') result = spellchecker(word) if result: print result else: print 'NO SUGGESTION' except KeyboardInterrupt: sys.exit(1)
  • 好的,看起来您希望 first.py 生成一些输出,并且您希望 second.py 使用它,因为 first.py 生成一些输出。你希望它永远存在。好吧,据我所知,流水线不可能做到这一点,因为流水线的工作原理是第二个命令仅在第一个命令完全执行时才执行。在您的情况下, first.py 根本没有完成。为了实现您想要的,最简单的解决方案是 TCP 套接字,其中一个进程向另一个进程发送数据,而另一个进程仅在收到任何数据时才工作。
  • 这也可能永远持续下去。这不是实现这一目标的唯一方法,但还有许多其他方法可以做到这一点。这可能是最简单的方法。另一种方法是,使用另一个 python 脚本(比如 main.py),它连续运行 first.py 并在 while 循环中使用 second.py 对其进行管道传输。不同之处在于您必须确保 first.py 和 second.py 必须在那里完成执行。
  • 如果我的 first.py 只返回单个值并且每次 second.py 需要输入时都被调用,有没有更好的方法来解决这个问题?
  • 好吧,一种方法可能是你可以让你的 first.py 每次执行只返回一个值。并让您的 second.py 使用 subprocess 多次执行 first.py 。这能解决您的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 2015-11-10
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2021-12-07
  • 2011-12-13
相关资源
最近更新 更多