我想用pyinstall编译python3程序(包括Pool),它有一些错误。 我的程序的名称是' ls.py',当我用Pyintall编译程序时,它会生成一个名为' ls.exe'的程序。我运行它,打印Nothing。 我的代码在这里:
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编译程序,运行正常! 所以,我认为问题是由
引起的'from multiprocessing import Pool'
所以,请帮我解决这个问题,谢谢
Python 3.4的版本,Pyinstall是PyInstaller-3.2.1-py3.4.egg
答案 0 :(得分: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
原帖
似乎你需要将结果返回到mp线程,收集它然后打印它
Pool对象控制工作进程池。可以将作业提交给池,然后池将作业发送给各个工作人员。作业完成后,将收集状态并返回主进程。
如果您将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)
<强>输出:强> win32上的Python 2.7.9(默认,2014年12月10日,12:24:55)[MSC v.1500 32位(英特尔)] 输入“copyright”,“credits”或“license()”以获取更多信息。
================================ RESTART ============== ==================
[1,4,9,16]