使用Pyinstall错误编译python3程序(包括Pool)

时间:2017-03-18 02:55:04

标签: python pool

我想用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

1 个答案:

答案 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]