PyInstaller: модуль не включен в -onefile, но отлично работает с --oneir
Я использую PyInstaller для объединения моего приложения в один файл .exe.
Проблема в том, что он отлично работает с опцией --oneir, но не может найти модуль при построении с -onefile.
Оба --oneir и -onefile говорят во время процесса сборки:
<...>
INFO: Analyzing hidden import 'sklearn.utils.sparsetools._graph_validation'
<...>
Запуск экземпляра, созданного с помощью --oneir, отлично работает, но экземпляр, созданный --onefile, умирает:
<...>
File "_min_spanning_tree.pyx", line 8, in init sklearn.utils.mst._min_spanning
_tree (sklearn\utils\sparsetools\_min_spanning_tree.c:4754)
ImportError: No module named _graph_validation
Вот мои файлы .spec
onedir.spec
# -*- mode: python -*-
a = Analysis(['../../brainactivity.py'],
hiddenimports=['greenlet', 'sklearn.utils.sparsetools._graph_validation', 'sklearn.utils.sparsetools._graph_tools', 'scipy.special._ufuncs_cxx', 'sklearn.utils.lgamma', 'sklearn.utils.weight_vector'],
hookspath=None,
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='brainactivity.exe',
debug=False,
strip=None,
upx=True,
console=True,)
coll = COLLECT(exe,
a.binaries,
[('./data/201305182224-DF-facial-3-420.csv', '../../data/201305182224-DF-facial-3-420.csv', 'DATA')],
[('./model/brain_20k_colored_properly.obj', '../../model/brain_20k_colored_properly.obj', 'DATA')],
[('brain_fragment_shader.glsl', '../../brain_fragment_shader.glsl', 'DATA')],
[('brain_vertex_shader.glsl', '../../brain_vertex_shader.glsl', 'DATA')],
a.zipfiles,
a.datas,
strip=None,
upx=True,
name='brainactivity')
onefile.spec
# -*- mode: python -*-
a = Analysis(['../../brainactivity.py'],
hiddenimports=['greenlet', 'sklearn.utils.sparsetools._graph_validation', 'sklearn.utils.sparsetools._graph_tools', 'scipy.special._ufuncs_cxx', 'sklearn.utils.lgamma', 'sklearn.utils.weight_vector'],
hookspath='.',
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
[('./data/201305182224-DF-facial-3-420.csv', '../../data/201305182224-DF-facial-3-420.csv', 'DATA')],
[('./model/brain_20k_colored_properly.obj', '../../model/brain_20k_colored_properly.obj', 'DATA')],
[('brain_fragment_shader.glsl', '../../brain_fragment_shader.glsl', 'DATA')],
[('brain_vertex_shader.glsl', '../../brain_vertex_shader.glsl', 'DATA')],
a.zipfiles,
a.datas,
name='brainactivity.exe',
debug=False,
strip=None,
upx=True,
console=True )
Ответы
Ответ 1
У меня была такая же ошибка. Решение состоит в том, чтобы создать крючок для sklearn.
Как правило, вам нужно создать файл с крючком, подобный этому
hiddenimports = ['sklearn.utils.sparsetools._graph_validation']
и сохраните это в файле с именем hook-modulename.py
в той же папке. Но это будет импортировать только _graph_validation. Это может привести к ошибке для другого модуля.
Лучше всего импортировать все подмодули в пакете
from hookutils import collect_submodules
hiddenimports = collect_submodules('sklearn')
и сохраните его в файле с крючками в той же папке. Для меня мне пришлось создать 2 файла с крючками. один для sklearn и один для scipy.
from hookutils import collect_submodules
hiddenimports = collect_submodules('scipy')
после их сохранения я использовал команду ниже для запуска
pyinstaller --additional-hooks-dir =. myfile.py
для лучшего понимания следуйте http://pythonhosted.org/PyInstaller/hooks.html#understanding-pyinstaller-hooks
Ответ 2
просто импортируйте следующие пакеты в скрипт, который будет конвертирован в исполняемый файл
import xgboost
import sklearn.ensemble
import sklearn.tree
import pickle
import pandas as pd
import sklearn.neighbors.typedefs
import sklearn.neighbors.quad_tree
import sklearn.tree._utils
import cython
import sklearn
import sklearn.utils._cython_blas
import numpy as np
import joblib
from sklearn.preprocessing import StandardScaler
это поможет мне в решении этой проблемы.