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