Как устранить отсутствующий служебный модуль, не позволяющий запустить мой исполняемый файл, когда я уже установил родительский модуль? - PullRequest
0 голосов
/ 03 июля 2019

Я написал несколько скриптов Python для создания графического интерфейса tkinter для процесса алгоритма машинного обучения.Я изначально все кодировал в PyCharm, но мне бы очень хотелось собрать все вместе в отдельный исполняемый файл.Я переместил свой основной сценарий и его зависимости .py в их собственный каталог и протестировал его с помощью командной строки, и он прекрасно работает.Однако, когда я запускаю pyinstaller, исполняемый файл создается, но не запускается при запуске.

Программа состоит из трех файлов, основным сценарием является GUI.py.Как упоминалось выше, я переместил зависимые файлы в новый каталог и протестировал GUI.py в командной строке, и он отлично работал.Исполняемый файл создан (хотя и с большим количеством предупреждений об отсутствующих файлах 'api-ms-win-crt'), но не может быть запущен.

Я создал исполняемый файл с помощью команды:

pyinstaller --onefile GUI.py

Когда исполняемый файл запускается из командной строки после создания, я получаю большую длинную трассировку, заканчивающуюся следующим:

File "site-packages\sklearn\metrics\pairwise.py", line 32, in <module>
File "sklearn\metrics\pairwise_fast.pyx", line 1, in init 
    sklearn.metrics.pairwise_fast
ModuleNotFoundError: No module named 'sklearn.utils._cython_blas'
[3372] Failed to execute script GUI

Я знаю, что я уже явно импортировал sklearn через командную строку, ноСудя по трассировке, мне кажется, что я где-то пропустил служебный модуль.Я попытался импортировать отсутствующий модуль специально, но я получил ошибку, что распределенный модуль недоступен.У меня нет большого опыта работы с pyinstaller, и я понятия не имею, куда идти отсюда.Я использую Windows 10 и Python 3.7.3.

1 Ответ

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

Похоже, что Pyinstaller не может разрешить sklearn импорт.Таким образом, один простой способ - просто привести весь каталог модулей, который находится в <path_to_python>/Lib/site-packages/sklearn/, с исполняемым выводом.Поэтому используйте приведенный ниже файл спецификации для генерации вашего исполняемого файла:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['test.py'],
             pathex=['<path to root of your project>'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
a.datas += Tree('<path_to_sklearn_in_python_dir>', prefix='sklearn')
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='test',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=False,
          runtime_tmpdir=None,
          console=True )

Наконец, сгенерируйте свой исполняемый файл с

pyinstaller test.spec

Это должно устранить ошибки импорта для sklearn, но если вы столкнулись с другими операциями импорта NotFound, добавьтеих как выше, чтобы специфицировать файл.

...