PyInstaller и панды

У меня есть довольно простой модуль Python, который я пытаюсь скомпилировать в файл Windows .exe. В своем скрипте я использую библиотеки wxPython и Pandas. Файл PyInstaller .exe, который создается только, работает / открывается, когда библиотека Pandas исключена из моего модуля.

У меня такая же проблема, независимо от того, использую ли я --onefile или --onedir в PyInstaller. В Интернете я обнаружил, что «новая» версия PyInstaller (2.1) должна была устранить эту ошибку. У кого-нибудь есть идеи, что делать?

PyInstaller: version 2.1
pandas: version 0.15.2
Python: version 2.7

person bsheehy    schedule 17.03.2015    source источник
comment
Мое сообщение было удалено ChrisF ♦, надеюсь, эта ссылка поможет любому, кто ищет ответ на этот вопрос более подробно Файл EXE, созданный программой Pyinstaller, не может загрузить модель keras nn   -  person Santhosh Dhaipule Chandrakanth    schedule 18.07.2019


Ответы (7)


Я столкнулся с той же проблемой. Я свел это к простому скрипту вроде Hello.py:

import pandas
print "hello world, pandas was imported successfully!"

Чтобы правильно импортировать панды во время выполнения, мне пришлось изменить 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

из командной строки и получил ожидаемое сообщение «привет, мир». Я до сих пор не совсем понимаю, зачем это нужно. У меня есть пользовательская сборка панд, которая подключена к библиотекам MKL, но мне не ясно, что это вызывает сбой запуска.

Это похоже на ответ здесь: Pyinstaller не корректно импортирует pycripto ... иногда

person physicistintheory    schedule 06.10.2015
comment
@ Physicistintheory - После использования вашего предложения моя программа отлично работала с console = True, но она не работает, когда console = False. Но когда я говорю «Истина», я получаю в конце черное командное окно вместе с желаемым исполняемым окном, которое не требуется. Когда я пытаюсь удалить черное окно, мое желаемое окно также закрывается. Не могли бы вы предложить мне! - person ali; 12.12.2018
comment
что такое дерево в этом контексте? - person Nebi M Aydin; 07.02.2020

У меня была аналогичная проблема с pyinstaller версии 3.3. Решение заключалось в том, что отсутствовал перехватчик hiddenimport, как описано здесь

Я создал новый файл в Pyinstaller / hooks / под названием hook-pandas.py и поместил содержимое, как описано в этом коммите здесь и переустановите pyinstaller вручную через python setup.py install в каталоге Pyinstaller.

Проблема не повторялась, когда я создавал exe из моего сценария pandas с помощью pyinstaller с параметром --onefile.

person John    schedule 26.11.2017
comment
Это сработало для меня, хотя мне не пришлось переустанавливать Pyinstaller. - person kaisquared; 05.03.2018
comment
Этот ответ упрощает все до набора командных строк: stackoverflow.com/a/48846546/4355695 - person Nikhil VJ; 24.04.2018

Как и другое решение, добавление --hidden-import=pandas._libs.tslibs.timedelta или чего-то еще, что модуль отсутствует в команде pyinstaller, также работает.

Это может быть полезно, если вы не хотите прикасаться к источнику pyinstaller.

person Alto.Clef    schedule 11.07.2018

У меня была точно такая же проблема, и я нашел другое решение (на самом деле единственное, которое сработало для меня):

Я следил примерно за этим: https://medium.com/@liron92/pyinstaller-with-pandas-problems-solutions-and-workflow-with-code-examples-c72973e1e23f

За исключением того факта, что я запускаю свою виртуальную среду на Anaconda.

Быстрое пошаговое решение

Прежде чем я начну: это шаги, которые я выполнил в моем конкретном случае, вы можете немного адаптировать их в зависимости от вашей ситуации.

1) Создайте и настройте свою виртуальную среду

Я использовал Anaconda для создания своего env:

conda create --name myenv

Затем я установил весь необходимый мне модуль:

conda install -n myenv pandas
conda install -n myenv -c conda-forge python-docx
etc.

2) Активируйте среду и переключитесь на путь к проекту.

В подсказке Anaconda:

conda activate myenv
cd path/to/your/project/folder

3) Создайте и измените свой файл * .spec

Все еще в том же окне Anaconda Prompt:

pyi-makespec project.py

Затем откройте файл project.spec, он будет выглядеть так:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['project.py'],
             pathex=['path/to/your/project/folder'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='main')

Вы просто изменяете hiddenimports = [] и добавляете весь неявный импорт (включая панды). В моем случае я также использовал Tkinter, поэтому я указал:

hiddenimports=['pandas', 'tkinter']

4) Наконец запустите pyinstaller

В том же окне Anaconda Prompt (среда активирована в каталоге вашего проекта):

pyinstaller main.spec

И тогда все готово!

Отказ от ответственности

Я везде вижу людей, говорящих вам, что вы должны использовать --onefile при компиляции проекта Python с помощью Pyinstaller, я честно думаю, что вам не следует этого делать: это замедляет работу * .exe. Может быть, мне что-то не хватает, поэтому, пожалуйста, объясните мне, если вы воспользуетесь этим.

Технические характеристики

Windows 10
Anaconda 4.8.2
Python 3.7.6
Pandas 1.0.5
person Arthur    schedule 23.07.2020

Я решил ту же проблему, используя файл перехвата в каталоге проекта (для каждого документа 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', ...] в файл спецификации, но почему-то не получилось, как ожидалось.

person mikey    schedule 17.11.2018

С python version = 3.8 и pyinstaller = 3.6 нет необходимости настраивать pyinstaller или добавлять хуки pandas, hook-pandas.py уже существует в Lib \ site-packages \ PyInstaller \ hooks, и все работает нормально.

person vpa    schedule 06.04.2020
comment
У меня не сработало, когда .exe был создан в Windows 7, но я попытался запустить его в Windows 10. Pyinstaller 3.6, Python 3.8.2 - person Charalamm; 26.05.2020
comment
Не работают у меня с python 3.8.3 и pyinstaller 3.6 - person EBH; 03.06.2020

Для всех, кто хочет преобразовать скрипты Python с участием pandas в exe в 2021 году

Я много боролся с pyinstaller, но добился отличных результатов с Нуитка. Перки:

  • малый размер файла (500 КБ)
  • быстрое время сборки и выполнения (аналогично времени выполнения Python)
  • и самое главное: панды поддерживают "из коробки" без виртуальных окружений!

Просто установите nuitka

pip install nuitka

и построить exe

nuitka hello.py

После этого вы даже можете использовать upx для дальнейшего сжатия!

upx hello.exe

В моем случае размер файла уменьшен до 1/3, всего ~ 150 КБ .exe размер файла для простого чтения сценария pandas и сохранения файла excel.

Дополнительную информацию см. в моем сообщении в блоге.

person do-me    schedule 25.06.2021