【问题标题】:Nonblocking redirection of output from multiprocess process多进程进程输出的非阻塞重定向
【发布时间】:2011-08-18 12:09:40
【问题描述】:

我昨天问了一个关于我用 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),它描述了如何重定向子进程的输出,但问题是在评估完成后才收到输出。

【问题讨论】:

  • 你为什么要这样做?当人们说某人“滥用eval”时,这正是。这整个方法是错误的,重定向输出不会解决它。
  • 那我应该用什么方法呢?请赐教,因为我对 python 编程很陌生
  • 我无法回答这个问题,因为您没有明确说明您在做什么,我在回答您之前的问题时提出了一个建议。你试过testmodule = __import__(test),然后ret = getattr(testmodule, test)()吗?这至少会比eval 好。另外,为什么你的test 打印输出而不是使用yieldreturn?从函数输出信息在任何语言中都是错误的。

标签: python wxpython stdout multiprocessing pipe


【解决方案1】:

解决您当前问题的方法是使用两个Queue.Queues 而不是一个。我们称他们为inqueueoutqueue。那么

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-14
    • 2012-01-18
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多