Почему я не могу создать ThreadPool в cx_Freeze? - PullRequest
2 голосов
/ 29 июня 2019
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'

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Попробуйте добавить 'multiprocessing' в список packages build_exe_options в сценарии setup.py:

build_exe_options = {"packages": ['multiprocessing']}

# ...

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

Подробнее см. Документацию cx_Freeze .

Обратите также внимание, что вам придется вызывать multiprocessing.freeze_support(), чтобы ваш замороженный скрипт продолжал работать с многопроцессорной обработкой. Согласно документации :

Добавлена ​​поддержка, когда программа, использующая многопроцессорную обработку, была заморожена для создания исполняемого файла 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.

Вызов freeze_support() не действует при вызове в любой операционной системе, кроме Windows. Кроме того, если модуль нормально запускается интерпретатором Python в Windows (программа не была заморожена), то freeze_support() не имеет никакого эффекта.

0 голосов
/ 29 июня 2019

Во-первых, похоже, что вам не хватает многопроцессорной библиотеки , которую вы можете получить с помощью pip.

Во-вторых, Многопроцессорная документация Python 3.5 не включает ThreadPool. Если вам нужен пул процессов, вы ищете:

 class multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])
...