昨天我问了一个关于我用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)描述了如何重定向子进程的输出,但问题是在评估完成后收到了输出。
答案 0 :(得分:1)
您当前问题的解决方案是使用两个Queue.Queue
而不是一个。{我们称他们为inqueue
和outqueue
。然后
def runtest(inqueue,outqueue):
test = inqueue.get()
module=__import__(test)
ret=getattr(module,test)()
outqueue.put(ret)
更大的问题涉及如何使用来自单独进程的输出来控制TextCtrl
等GUI元素。答案是你没有。而是生成一个线程(如果你喜欢生成其他进程,可以生成),它可以从outqueue
接收值,并且(与不同的进程不同)更新TextCtrl
。
有关如何进行此设置的示例,请参阅LongRunningTasks wiki。