16

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ポートを使用していることに注意して ください 。これが、multiprocessing.Processではなくprocessing.Processである理由です。これは違いを生むべきではありません。私は正しいですか?)

ボタンクリック信号に接続されているコードは、次のようなものです。

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

プログラムは、Pythonインタープリターの下で期待どおりに動作します。つまり、コマンドライン「pythonmyapp.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_()

この問題を解決する方法に関する解決策はありますか?ありがとう!

4

3 に答える 3

26

私はあなたの実際の問題はこれに関係していると思います:

プログラムは、Pythonインタープリターの下で期待どおりに動作します。つまり、コマンドライン「pythonmyapp.py」から起動した場合です。

ただし、py2exeを使用してプログラムをパッケージ化した後、そのボタンをクリックするたびに、>バックグラウンドタスクを開始する代わりに、メインウィンドウのコピーがポップアップ表示されます。

マルチプロセッシングモジュールを「凍結された」実行可能ファイル(たとえば、py2exeで作成されたもの)で機能させるには、freeze_support()関数に特別な呼び出しを追加する必要があります。

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

于 2010-02-04T00:52:34.107 に答える
0

「このパッケージ内の機能には、メインメソッドが子によってインポート可能である必要があります。」

これは、main()関数をどこかに定義する必要があることを意味すると思います。

于 2010-01-29T05:27:39.870 に答える
0

質問はPython2に関するものであり、解決されました。Python 3の場合、次のようになります。

from multiprocessing import freeze_support

if __name__ == '__main__':
    freeze_support()

    a = QApplication(sys.argv)
    ...
于 2017-12-28T12:44:47.400 に答える