2017-03-18 79 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程序什么都不返回,帮助 –