为啥我不能在 cx_Freeze 中创建线程池?
Posted
技术标签:
【中文标题】为啥我不能在 cx_Freeze 中创建线程池?【英文标题】:Why can't I create a ThreadPool in cx_Freeze?为什么我不能在 cx_Freeze 中创建线程池? 【发布时间】:2019-06-29 10:03:18 【问题描述】:Traceback (most recent call last):
File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
module.run()
File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run
exec(code, m.__dict__)
File "D:/ruanjian/new/Ui-Disign/hand_up_625.py", line 25, in <module>
from keras.models import load_model
File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\__init__.py", line 3, in <module>
from . import utils
File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\utils\__init__.py", line 4, in <module>
from . import data_utils
File "C:\Users\Jun\AppData\Local\Programs\Python\Python35\lib\site-packages\keras\utils\data_utils.py", line 19, in <module>
from multiprocessing.pool import ThreadPool
ImportError: No module named 'multiprocessing.pool'
【问题讨论】:
【参考方案1】:尝试将'multiprocessing'
添加到setup.py
脚本中build_exe_options
的packages
列表中:
build_exe_options = "packages": ['multiprocessing']
# ...
setup( name = ..., # complete!
...
options = "build_exe": build_exe_options,
executables = [Executable(...)])
请参阅 cx_Freeze documentation 了解更多详情。
还请注意,您必须致电 multiprocessing.freeze_support()
以获取冻结脚本以继续使用多处理。根据documentation:
添加对使用多处理的程序被冻结以生成 Windows 可执行文件时的支持。 (已使用 py2exe、PyInstaller 和 cx_Freeze 进行测试。)
需要在主模块的
if __name__ == '__main__'
行之后直接调用此函数。例如:from multiprocessing import Process, freeze_support def f(): print('hello world!') if __name__ == '__main__': freeze_support() Process(target=f).start()
如果
freeze_support()
行被省略,那么尝试运行冻结的可执行文件将引发 RuntimeError。在 Windows 以外的任何操作系统上调用
freeze_support()
时均无效。另外,如果模块在Windows上被Python解释器正常运行(程序没有被冻结),那么freeze_support()
没有任何作用。
【讨论】:
【参考方案2】:首先,您似乎缺少multiprocessing library,您可以使用 pip 获得。
其次,Python 3.5's multiprocessing documentation 不包括线程池。如果你想要一个进程池,你正在寻找:
class multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])
【讨论】:
现在的问题是关于导入错误,没有名为“multiprocessing.pool”的模块。 cx_Freeze 找不到模块:'multiprocessing.pool',我需要制作一个可执行文件 (.exe)。该代码可以完全运行,但是当我使用 cx_Freeze 制作可执行文件时出现导入错误,但我确实在多处理中找到了 pool.py 听起来 cx_freeze 没有看到那个库——the cx_freeze documentation 关于包含/包的解决方案有帮助吗?以上是关于为啥我不能在 cx_Freeze 中创建线程池?的主要内容,如果未能解决你的问题,请参考以下文章