【问题标题】: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'

【问题讨论】:

    标签: python-3.x keras python-multiprocessing cx-freeze


    【解决方案1】:

    尝试将'multiprocessing'添加到setup.py脚本中build_exe_optionspackages列表中:

    build_exe_options = {"packages": ['multiprocessing']}
    
    # ...
    
    setup(  name = ...,  # complete!
            ...
            options = {"build_exe": build_exe_options},
            executables = [Executable(...)])
    

    请参阅 cx_Freeze documentation 了解更多详情。

    还请注意,您必须致电 multiprocessing.freeze_support() 以获取冻结脚本以继续使用多处理。根据documentation

    添加对使用多处理的程序被冻结以生成 Windows 可执行文件时的支持。 (已使用 py2exePyInstallercx_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 关于包含/包的解决方案有帮助吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多