多进程进程的非阻塞重定向输出

时间:2011-08-18 12:09:40

标签: python wxpython stdout multiprocessing pipe

昨天我问了一个关于我用Python写的程序问题(Passing wxPython objects as multiprocessor arguments)。我设法通过对评估脚本的函数使用多进程进程来解决该问题。但是,由于脚本是从不同的进程运行的,因此它们的输出没有正确地重定向到我的wxPython TextCtrl窗口。所以,我正在寻找将childprocess的输出重定向到我的主进程的方法,以便将其写入我的文本窗口。

这是设置过程的功能:

def createprocess(test):
    q = Queue()
    q.put(test)
    p = Process(target=runtest, args=(q,))
    p.start()
    p.join()
    return q.get()

这是该过程的目标函数:

def runtest(q):
    test = q.get()
    exec 'import ' + test
    func=test+'.'+test+'()'
    ret = eval(func)
    q.put(ret)

我发现这个线程(How can I send python multiprocessing Process output to a Tkinter gui)描述了如何重定向子进程的输出,但问题是在评估完成后收到了输出。

1 个答案:

答案 0 :(得分:1)

您当前问题的解决方案是使用两个Queue.Queue而不是一个。{我们称他们为inqueueoutqueue。然后

def runtest(inqueue,outqueue):
    test = inqueue.get()
    module=__import__(test)
    ret=getattr(module,test)()    
    outqueue.put(ret)

更大的问题涉及如何使用来自单独进程的输出来控制TextCtrl等GUI元素。答案是你没有。而是生成一个线程(如果你喜欢生成其他进程,可以生成),它可以从outqueue接收值,并且(与不同的进程不同)更新TextCtrl。 有关如何进行此设置的示例,请参阅LongRunningTasks wiki。