多处理问题[pyqt,py2exe]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多处理问题[pyqt,py2exe]相关的知识,希望对你有一定的参考价值。
我正在使用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 intepreter下按预期工作,即它是从命令行“python myapp.py”启动的。
但是,在我使用py2exe打包程序后,每次单击该按钮时,都会弹出主窗口的副本,而不是启动后台任务。我不确定这种行为的原因是什么。我想这与http://docs.python.org/library/multiprocessing.html#multiprocessing-programming提到的以下注释有关
“这个包中的功能要求主要方法可由子进程导入。这在编程指南中有所涉及,但值得指出这一点。这意味着一些例子,例如multiprocessing.Pool示例在交互式解释器中不起作用“
如果name ==“main”,我唯一拥有的地方就是在主模块中,就像典型的pyqt程序一样
if __name__ == "__main__":
a = QApplication(sys.argv)
QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
w = MainWindow()
w.show()
a.exec_()
有关如何解决此问题的任何解决方案?谢谢!
我认为你的实际问题与此有关:
该程序在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
“这个软件包中的功能要求主要方法可由孩子们输入。”
我认为这意味着你必须在某处定义main()函数。
问题是关于Python 2并且已经解决了。对于Python 3,它看起来像:
from multiprocessing import freeze_support
if __name__ == '__main__':
freeze_support()
a = QApplication(sys.argv)
...
以上是关于多处理问题[pyqt,py2exe]的主要内容,如果未能解决你的问题,请参考以下文章