小编典典

多处理问题[pyqt,py2exe]

python

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

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

    def run(self):
        ...

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

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

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

该程序可以在python解释器下正常运行,即,如果它是从命令行“ python myapp.py”启动的。

但是,在使用py2exe打包程序之后,每次单击该按钮时,都会弹出主窗口的副本,而不是启动后台任务。我不确定这种行为的原因是什么。我想这与http://docs.python.org/library/multiprocessing.html#multiprocessing-
programming上的以下注释有关

“此包中的功能要求
方法可以由子级导入。这在编程指南中已进行了介绍,但是在这里值得指出。这意味着某些示例,例如多处理。池示例在交互式解释器中不起作用。 ”

如果 name ==“ main ”,我唯一的位置是在主模块中,就像在典型的pyqt程序中一样

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

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


阅读 226

收藏
2020-12-20

共1个答案

小编典典

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

该程序可以在python解释器下正常运行,即,如果它是从命令行“ 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

2020-12-20