3

で失敗しますパラメータについては、チュートリアルのhttp://zqdevres.qiniucdn.com/data/20150702120338/index.htmlを参照してください。pyInstallerの内蔵のWindows EXEは、私は次のように複数のプロセスを作成するために、Pythonのmultiprocessing.Poolライブラリを使用していmultiprocessing.pool

プロジェクトはPyInstaller 3.1.1を使用して単一のWindows EXEにパッケージングされています。 --onedirオプションを付けてください。 PyInstallerは問題なくEXEを作成します。問題なくマルチスレッドを使用しないプログラムの部分を実行できます。

上記のマルチプロセッシング機能を使用するプログラムの一部を実行しようとすると、私の問題が発生します。その後、プログラムは、(それぞれの子スレッドでオーバー上書きして)次のエラーメッセージで失敗します

File "multiprocessing\context.py", line 148, in freeze_support 
    File "multiprocessing\spawn.py", line 74, in freeze_support 
    File "multiprocessing\spawn.py", line 106, in spawn_main 
    File "multiprocessing\spawn.py", line 115, in _main 
    File "multiprocessing\spawn.py", line 221, in prepare 
    File "multiprocessing\context.py", line 231, in set_start_method 
RuntimeError: context has already been set 
classifier_v3_gui returned -1 

freeze_supportはメインが最初の行に呼び出しが含まれている必要がありhttps://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessingからの提案、として来ます同様の問題がPyInstaller-built Windows EXE fails with multiprocessingで議論し、しかし、a)は--onedirについて議論し解決策は、あなたがエラーから見ることができるように、私のために動作するようには思えない、上記のリンクにある溶液を意味している

if name == "__main__": 
    multiprocessing.freeze_support() 

私が得るメッセージ、b)私は_PopenがPool-ingにどのように関連しているかわからないので、--onefileの場合、私はどのようにしてクラスの再定義を実装します。

mainでmultiprocessing.freeze_support()を使用しないと、RuntimeErrorが起こらないという点でプログラムが動作する代わりに、cmdに何度も印刷されたプログラムの使用方法が何度も表示されます。 EXE自体を呼び出そうとしている生成されたプロセスのうち、明らかに何が起こるべきかはわかりません。

言うまでもなく、プログラムは.pyスクリプトとして問題なく実行されます。

私は私が考えることができる唯一の他のソリューションは、マルチプロセッシングを使用するように私の解決策を書き換えることであるのWindows 10上の32ビットのPython 3.4(同様のPython 2.7と同じマルチスレッドの問題があった)

を使用しています。マルチプロセッシングの代わりにプロセス。プール、修正があるようです。私のプール機能がやっていることをやる努力がかなり少ない場合は、それを解決します。

+0

こんにちは@Mjellmaさん、あなたの質問に答えてください。私はあなたがこのエラーを処理できることを理解しています。 – mathiasfk

答えて

1

あなたの問題を解決できましたか?私は同じ種類の問題を抱えていますが、簡単なコードで動作させることができました。しかし、それは私の完全なコーディング(sklearnを使用して)ではまだ動作しません。あなたがそれを機能させることができれば、私に教えてください。私は自分のアプリケーションをコンパイルするpyInstallerの中に「-D」オプション(1ディレクトリ)を使用してい

import multiprocessing 
import time 

def func (param1, param2): 
    print ("hello " + str (param1)) 
    time.sleep (param2) 
    print ("Hello again " + str (param1)) 
    return "test " + str (param1) 

def main(): 
    lParams = [("test1", 3), 
       ("test2", 2), 
       ("test3", 1)] 
    args = [] 
    for param1, param2 in lParams: 
     tup = (param1, param2) 
     args.append (tup) 

    with multiprocessing.Pool (multiprocessing.cpu_count()) as p: 
     results = [p.apply_async (func, a) for a in args] 
     for r in results: 
      print ("Returned " + r.get()) 

if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    main() 

注:ここ

は私のために働いた符号化です。

+0

私のために働いていたのは、関数スコープでグローバルな名前空間からライブラリをインポートすることでした。これはもう少し前になって以来、なぜ私はもう覚えていないのですが、図書館を移動することで、私が進んで最終的にプロジェクトを終えることができる場所に私を連れて行くことを思い出します。 これで問題が解決しない場合は、私に知らせてください。私はいつもあなたとコードを共有することができます。 – Mjellma

関連する問題