我正在使用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/获取, 这就是为什么它是processing.Process而不是multiprocessing.Process。 我猜这不应该有区别。我是对的吗?)
与按钮点击信号连接的代码非常简单,如下:
processing.freezeSupport()
task = BackgroundTask(input)
task.start()
程序在Python解释器下运行时(即从命令行“python myapp.py”启动时),如预期工作。但是,当我使用py2exe打包程序后,每次单击按钮时,不会启动后台任务,而是弹出主窗口的副本。我不确定这种行为的原因。我猜测这与以下注释有关,该注释在http://docs.python.org/library/multiprocessing.html#multiprocessing-programming中提到:
“此软件包中的功能要求子进程可以导入主方法。 尽管编程指南涵盖了此问题,但是在这里指出也很重要。 这意味着一些示例(例如multiprocessing.Pool示例)在交互式解释器中无法正常工作。”
我在主模块中唯一使用“if name == 'main'”是在典型的pyqt程序中。
if __name__ == "__main__":
a = QApplication(sys.argv)
QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
w = MainWindow()
w.show()
a.exec_()
有没有解决这个问题的方法?谢谢!