PyInstaller и Pandas
У меня есть довольно простой модуль Python, который я пытаюсь скомпилировать в файл .exe Windows. В моем скрипте я использую библиотеки wxPython и Pandas. Файл PyInstaller.exe, который генерируется, работает/открывается только тогда, когда библиотека Pandas исключена из моего модуля.
Я получаю ту же проблему, использую ли я --onefile
или --onedir
в PyInstaller. В Интернете я обнаружил, что "новая" версия PyInstaller (2.1) должна была позаботиться об этой ошибке. У кого-нибудь есть идеи, что делать?
PyInstaller: version 2.1
pandas: version 0.15.2
Python: version 2.7
Ответы
Ответ 1
Я столкнулся с той же проблемой. Я сварил его до простого script, как этот Hello.py:
import pandas
print "hello world, pandas was imported successfully!"
Чтобы получить pandas для импорта во время выполнения правильно, мне пришлось изменить Hello.spec на следующее:
# -*- mode: python -*-
block_cipher = None
def get_pandas_path():
import pandas
pandas_path = pandas.__path__[0]
return pandas_path
a = Analysis(['Hello.py'],
pathex=['C:\\ScriptsThatRequirePandas'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
win_no_prefer_redirects=None,
win_private_assemblies=None,
cipher=block_cipher)
dict_tree = Tree(get_pandas_path(), prefix='pandas', excludes=["*.pyc"])
a.datas += dict_tree
a.binaries = filter(lambda x: 'pandas' not in x[0], a.binaries)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='Hello',
debug=False,
strip=None,
upx=True,
console=True )
scoll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=None,
upx=True,
name='Hello')
Затем я побежал:
$pyinstaller Hello.spec --onefile
из командной строки и получил сообщение "hello world", которое я ожидал. Я до сих пор не совсем понимаю, почему это необходимо. У меня есть пользовательская сборка pandas - которая подключена к библиотекам MKL, но мне непонятно, что это вызывает провал выполнения.
Это похоже на ответ здесь: Pyinstaller не корректирует импорт pycripto... иногда
Ответ 2
У меня была аналогичная проблема с pyinstaller версии 3.3. Решение состояло в том, что отсутствовал скрытый захват, как описано здесь
Я создал новый файл под Pyinstaller/hooks/called hook- pandas.py и разместил содержимое, как описано в этой фиксации здесь и переустановите pyinstaller вручную с помощью установки python setup.py в каталог Pyinstaller.
Проблема не повторялась, когда я создал exe из моего pandas script с помощью pyinstaller с помощью опции -onefile.
Ответ 3
Также как и другое решение, добавление --hidden-import=pandas._libs.tslibs.timedelta
или чего-либо еще, чего модуль отсутствует в команде pyinstaller
также работает.
Это может быть полезно, если вы не хотите прикасаться к источнику pyinstaller.
Ответ 4
Я решил ту же проблему, используя файл ловушек в каталоге проекта (согласно документу pyinstaller), hook-pandas.py
hiddenimports = [
'pandas._libs.tslibs.timedeltas',
'pandas._libs.tslibs.nattype',
'pandas._libs.tslibs.np_datetime',
'pandas._libs.skiplist',
]
затем добавив одну строку в файл спецификации:
...
a = Analysis([...
hookspath=['.'],
...],
...
Я попытался включить hiddenimports=[..., 'pandas',...]
в файл спецификаций, что-то не получилось, как ожидалось.
Ответ 5
Надеюсь, что это помогает любому, имеющему
'ModuleNotFoundError: No module named 'sklearn.*''
'ModuleNotFoundError: No module named 'h5py.*''
'ModuleNotFoundError: No module named 'sklearn.*''
Во время или после сборки pyinstaller
Пример, если вы получаете ошибку для h5py
После запуска pyinstaller myscript.py
myscript.spec
генерируется myscript.spec
myscript.spec
внутрь myscript.spec
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['myscript.py'],
binaries=None,
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=None)
# ... rest of a file untouched
добавлять
from PyInstaller.utils.hooks import collect_submodules
hidden_imports = collect_submodules('h5py')
а также
hiddenimports=hidden_imports,
Как это
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
from PyInstaller.utils.hooks import collect_submodules
hidden_imports = collect_submodules('h5py')
a = Analysis(['myscript.py'],
binaries=None,
datas=[],
hiddenimports=hidden_imports,
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=None)
# ... rest of a file untouched
Затем сохраните myscript.spec
и выполните команду pyinstaller myscript.spec
Кредит 9dogs Pyinstaller созданный EXE файл не может загрузить модель Keras NN