2011-08-18 50 views
-1

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

这是建立过程中的功能:

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

你为什么要这样做?这是__exactly__当人们说某人“滥用eval”时人们正在谈论的内容。这整个方法是错误的,重定向输出不会解决它。 – agf

+0

然后我应该使用什么方法?请赐教,因为我对Python编程颇为陌生 – Nait

+1

我不能回答这个问题,因为你还没有清楚地知道你在做什么,我在回答你的上一个问题时提出了一个建议。你试过'testmodule = __import __(test)',然后'ret = getattr(testmodule,test)()'?那至少会比'eval'好。另外,为什么你的'test'打印输出而不是使用'yield'或'return'?从任何语言输出信息都是错误的。 – agf

回答

1

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

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

较大的问题涉及如何控制GUI元素如TextCtrl与来自一个单独的进程的输出。答案是你没有。相反,产生一个线程(如果你喜欢产生其他进程,可以接收来自outqueue的值和(不同于单独的进程)更新TextCtrl。 请参阅LongRunningTasks wiki以获取有关如何设置的示例。

相关问题