簡體   English   中英

多處理問題[pyqt,py2exe]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM