2017-03-18 4 views
0

Pyinstallを使用してcomplie python3プログラム(プールを含む)が必要ですが、いくつかのエラーがあります。 私のプログラムの名前は 'ls.py'です。Pyintallでプログラムをコンパイルすると、 'ls.exe'というプログラムが生成されます。実行して、何も印刷しません。 私のコードはここにある:Pyinstallエラーを伴うPython3プログラム(プールを含む)のエラー

from multiprocessing import Pool 

def f(x): 
    print(x*x) 

if __name__ == '__main__': 
    p = Pool(2) 
    p.map(f,[1,2,3,4]) 

私はコードを変更した場合:

#from multiprocessing import Pool 

def f(x): 
    print(x*x) 

if __name__ == '__main__': 
    for i in range(1,5): 
     f(i) 

そしてPyinstallでプログラムをコンパイルし、それがOKに実行します! SO、私は問題が

ので
'from multiprocessing import Pool' 

によって引き起こされると考え、この問題で私を助けてください、ありがとう

のPython 3.4のバージョン、PyinstallはpyInstallerの-3.2.1-py3.4です.egg

答えて

0

EDIT2

は、コードにmultiprocessing.freeze_support()を追加しましたし、私たちはif __name__ == "__main__":を呼び出しているため、安全上の予防措置としてmain()機能にコードを移動します

ワーキングコード:さらに調査時

import multiprocessing 
def main(): 
    p = multiprocessing.Pool(2) 
    print(p.map(f, [1, 2, 3])) 

def f(x): 
    return x*x 

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

EDIT1

、あなたの方法は同様に動作ように見えます。ただ、 print(x*x)オリジナルポスト

def f(x): 
    return x*x 
return x*xには変更あなたが、スレッドを融点、それを収集し、それを印刷し、結果を返す必要がありそうです。
プールオブジェクトは、ワーカープロセスのプールを制御します。ジョブはプールに提出され、プールは個々のワーカーにジョブを送信します。ジョブが完了すると、ステータスが収集され、メインプロセスに戻されます。

あなたはreturn x*xからprint(x*x)を変更してもresults = p.map(f,[1,2,3,4])
で結果を収集する場合は、意図したとおりにコードが動作するprint(results)
使用してそれを印刷します。

ワーキングコード

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    p = Pool() 
    results = p.map(f,[1,2,3,4]) 
    print(results) 

出力: のPython 2.7.9(デフォルト、2014年12月10日、午前12時24分55秒)のWin32上の[MSC v.1500 32ビット(インテル)] 詳細については、「著作権」、「クレジット」または「ライセンス()」と入力してください。

================================ RESTART ======= =========================

[1、4、9、16]

+0

I試験2 melthold、どちらもPython 2または3で動作します!問題は次のとおりです:Pyinstallでそれを遵守しました。一つの方法はプールで別の方法で実行できました。間違っています –

+0

はい、OPはプールジョブ内にprintステートメントを持っていました。戻り値が変更された場合、コードは正常に動作します。 –

+0

また、freeze_support()を追加すると、exeプログラムは何も返しません。 –

関連する問題