2017-03-18 64 views
0

我想用Pyinstall編譯python3程序(包括Pool),它有一些錯誤。 我的程序名稱是'ls.py',當我用Pyintall編譯程序時,它生成一個名爲'ls.exe'的程序。我運行它,打印什麼。 我的代碼是在這裏:用Pyinstall錯誤編譯python3程序(包括Pool)

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! 所以,我認爲這個問題是由

'from multiprocessing import Pool' 

引起那麼,請幫我解決這個問題,謝謝

的Python 3.4的版本,Pyinstall是PyInstaller-3.2.1-py3.4 .egg

回答

0

EDIT2

新增multiprocessing.freeze_support()的代碼,併爲安全起見,移動代碼main()功能,因爲我們呼籲if __name__ == "__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)return x*x

def f(x): 
    return x*x 

原貼
看來你需要返回結果熔點線程,收集它,然後打印出來。
池對象控制工作進程池。可以將作業提交給池,池然後將作業發送給各個工人。一旦工作完成,狀態被收集並返回到主進程。

如果更改print(x*x)return 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秒)[MSC v.1500 32位(英特爾)]在Win32 輸入「copyright」,「credits」或「license()」以獲取更多信息。

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

[1,4,9,16]

+0

我測試2 melthold,它在Python 2或3中都運行正常!問題是:用Pyinstall編譯它;一種方式可以運行,另一種方式使用池,這是錯誤的 –

+0

是的,OP在池作業中有打印語句。如果它更改爲返回,則代碼運行良好。 –

+0

也,我添加freeze_support(),exe程序什麼都不返回,幫助 –