[英]multiprocessing problem [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)
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.