В PyInstaller нет модуля с именем "pandas._libs.tslibs.timedeltas"

Я пытаюсь обернуть сценарий Python в исполняемый файл, используя PyInstaller (версия для разработки) для Windows.

Скрипт использует Pandas, и я столкнулся с ошибкой при запуске exe.

Traceback (most recent call last):   File "site-packages\pandas\__init__.py", line 26, in <module>   File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)   File "site-packages\pandas\_libs\__init__.py", line 4, in <module>   File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 714, in load_module
    module = loader.load_module(fullname)   File "pandas/_libs/tslib.pyx", line 1, in init pandas._libs.tslib ModuleNotFoundError: No module named 'pandas._libs.tslibs.timedeltas'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):   File "G5k Version file Extract (with tkinter).py", line 15, in <module>   File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)   File "site-packages\pandas\__init__.py", line 35, in <module> ImportError: C extension: No module named 'pandas._libs.tslibs.timedeltas' not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace --force' to build the C extensions first.

Я пытался сделать это для программ без панд, и все было хорошо.

Это очень похоже на другой вопрос, уже решенный для Python 2, но я использую Python 3, и это решение не применяется таким же образом из-за измененного формата файла.spec.

Python 3.6
PyInstaller - версия 3.3
Панды - версия 0.20.3

3 ответа

PyInstaller 3.3, Pandas 0.21.0, Python 3.6.1.

Я смог решить эту проблему благодаря еще не опубликованному / зафиксированному исправлению PyInstaller, посмотрите это и это. И сохраняя возможность упаковать его в один исполняемый файл.

Основном:

  1. Найдите папку PyInstaller..\hooks, например C:\Program Files\Python\Lib\site-packages\PyInstaller\hooks,

  2. Создайте файл hook-pandas.py с содержимым (или чем-то похожим на основании вашей ошибки):

    hiddenimports = ['pandas._libs.tslibs.timedeltas']
    
  3. Сохрани его + я удалил.spec файл, build и dist папки просто чтобы быть уверенным.

  4. Бежать pyinstaller -F my_app.py.

Это исправление должно работать до тех пор, пока вы не обновите или не переустановите PyInstaller. Таким образом, вам не нужно редактировать файл.spec.

Может быть, они будут включать исправление раньше для нас!:)

Я не уверен, что это может вам помочь, но следуя решению в посте, о котором вы упомянули, работайте для меня с python 3.6, pyinstaller 3.3 и pandas 0.21.0 на windows 7.

Итак, добавив это в spec-файл сразу после анализа:

def get_pandas_path():
    import pandas
    pandas_path = pandas.__path__[0]
    return pandas_path

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)

Также мой формат файла спецификаций такой же, как и в посте, который вы упоминаете.

Мне удалось решить эту проблему с помощью флага "--hidden-import". Надеюсь, это может быть полезно для кого-то, кто сталкивается с этой темой.

pyinstaller --onefile --hidden-import pandas._libs.tslibs.timedeltas myScript.py

Если вы используете Anaconda, весьма вероятно, что когда вы пытались удалить какой-то пакет, он нарушил зависимость от pandas и не смог получить требуемый скрипт. Если вы просто бежите conda install pandas вы можете получить еще одну ошибку:

module 'pandas' has no attribute 'compat',

Итак, попробуйте удалить и переустановить панды conda uninstall pandas, Установите его снова используя conda install pandas это решит проблему. С другой стороны, если вы не используете Anaconda., Попробуйте сделать то же самое в командной строке, указывая на папку скриптов Python. pip uninstall pandas & pip install pandas,

В большинстве случаев это должно решить проблему. Просто чтобы покрыть все возможности, не забудьте запустить Spyder от Anaconda после установки панд.

Другие вопросы по тегам