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

Я пытаюсь обернуть скрипт Python в exe, используя 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

Ответ 1

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.

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

Ответ 2

Я не уверен, что это может вам помочь, но после решения этой должности вы упоминаете работу для меня с 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)

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

Ответ 3

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

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

Ответ 4

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

module 'pandas' has no attribute 'compat'.

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

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