如何在PYTHON中实现子进程的流输入?

时间:2012-06-11 04:24:25

标签: python subprocess

由于inputraw_input()停止程序运行,我想使用子进程来运行此程序......

while True: print raw_input()

并获得其输出。

这就是我的阅读计划:

import subprocess
process = subprocess.Popen('python subinput.py', stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
while True:
    output=process.stdout.read(12)
    if output=='' and process.poll()!=None:
        break
    if output!='':
        sys.stdout.write(output)
        sys.stdout.flush()

当我运行它时,子进程几乎与它开始时一样快地退出。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

我认为问题是子进程没有直接连接到stdoutstdin,因此无法接收键盘输入。大概是raw_input()抛出异常。

如果这是一个实际问题而不是实验,我建议您使用curses或pygame等库来处理输入。如果你正在尝试并想自己做,那么我想你将不得不查看线程而不是子进程,尽管这是一个相当复杂的尝试,所以你肯定会遇到其他问题。 / p>

答案 1 :(得分:1)

我担心它不会这样。

您认为subprocess将附加您的控制台(您的特殊 stdin)的情况。这不起作用,模块只有两个 用于指定:PIPESTDOUT

的选项

如果未指定任何内容,则子进程将无法使用 相应的流 - 它的输出将无处可去 没有输入。由于EOF,raw_input()结束。

要走的路是在“主”程序中输入, 以及在子流程中完成的工作。

编辑:

以下是multiprocessing

中的示例
from multiprocessing import Process, Pipe
import time

def child(conn):
    while True:
        print "Processing..."
        time.sleep(1)
        if conn.poll(0):
            output = conn.recv()
            print output
        else:
            print "I got nothing this time"

def parent():
    parent_conn, child_conn = Pipe()
    p = Process(target=child, args=(child_conn,))
    p.start()
    while True:
        data = raw_input()
        parent_conn.send(data)
    # p.join() - you have to find some way to stop all this...
    # like a specific message to quit etc.


if __name__ == '__main__':
    parent()

你当然需要通过找到一种方法来使其更加健壮 这种合作。在我的示例中,两个进程都在同一个文件中, 但你可以用不同的方式组织它。

此示例适用于Linux,Windows上的管道可能存在一些问题, 但它应该是完全可以解决的。

“处理”是您想要做其他事情的部分,而不仅仅是 等待来自父母的数据。

答案 2 :(得分:0)

好吧,尝试不同的架构。您可以使用zeromq

  1. Producer会生成所有项目(此处输出通过stdout发送)并通过zmq广播。

  2. 消费者应该听取生产者正在广播的端口号并相应地处理它们。

  3. 以下是示例http://code.saghul.net/implementing-a-pubsub-based-application-with

    Note

    使用geventmultiprocessing生成这些过程。

    您将拥有master计划,负责产生producerconsumer