多处理问题[pyqt,py2exe]

时间:2010-01-15 18:49:24

标签: python pyqt multiprocessing py2exe

我正在使用PyQt4编写GUI程序。 我的主窗口中有一个按钮 并单击此按钮。 我希望启动一个后台进程 这是派生类的一个实例 来自processing.Process。

class BackgroundTask(processing.Process):
    def __init__(self, input):
        processing.Process.__init__(self)
        ...

    def run(self):
        ...

(注意我使用的是Python2.5端口 获得的python-multiprocessing 从 http://code.google.com/p/python-multiprocessing/ 这就是为什么它正在处理。进程 而不是multiprocessing.Process。 我想这不应该有所作为。 我是对的吗?)

连接到按钮点击信号的代码 就像

一样
 processing.freezeSupport()
 task = BackgroundTask(input)
 task.start()

该程序在python intepreter下按预期工作,即 如果它是从命令行“python myapp.py”启动的。

然而,在我使用py2exe打包程序之后, 每当我点击那个按钮时,相反 启动后台任务,副本 弹出主窗口我不确定 这种行为的原因是什么?我猜 它与以下注释有关 在 http://docs.python.org/library/multiprocessing.html#multiprocessing-programming

“此软件包中的功能要求子项可以导入 main 方法。这在编程指南中有所涉及,但值得指出这一点。这意味着一些示例,例如多处理.Pool示例在交互式解释器中不起作用 “

如果名称 ==“主要”在主模块中,我唯一拥有的地方 就像在典型的pyqt程序中一样

if __name__ == "__main__":
    a = QApplication(sys.argv)
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
    w = MainWindow()
    w.show()
    a.exec_()

有关如何解决此问题的任何解决方案?谢谢!

3 个答案:

答案 0 :(得分:26)

我认为你的实际问题与此有关:

  

该程序在python intepreter下按预期工作,即如果它是从命令行“python myapp.py”启动的。

     

然而,在我使用py2exe打包程序后,每次单击该按钮时,>而不是启动后台任务,弹出主窗口的副本。

您需要对freeze_support()函数添加一个特殊调用,以使多处理模块使用“冻结”可执行文件(例如,使用py2exe创建的那些):

if __name__ == "__main__":
    # add freeze support
    processing.freeze_support()
    a = QApplication(sys.argv)
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
    w = MainWindow()
    w.show()
    a.exec_()

参考:http://docs.python.org/library/multiprocessing.html#multiprocessing.freeze_support

答案 1 :(得分:0)

“此程序包中的功能要求主要方法可由子项导入。”

我认为这意味着你必须在某处定义main()函数。

答案 2 :(得分:0)

问题是关于Python 2并且已经解决了。对于Python 3,它看起来像:

from multiprocessing import freeze_support

if __name__ == '__main__':
    freeze_support()

    a = QApplication(sys.argv)
    ...