Pyinstaller "Не удалось выполнить скрипт pyi_rth_pkgres" и отсутствующие пакеты

Я впервые публикую здесь вопрос, так как на большинство моих вопросов уже ответил кто-то еще! Я работаю над приложением с графическим интерфейсом на python и пытаюсь использовать pyinstaller для упаковки его в одну папку и.exe для облегчения переносимости. В настоящее время я использую windows 10 и anaconda3 для управления своими пакетами python. Приложение использует tkinter, pillow, numpy, scikit-learn, opencv, ffmpeg и matplotlib. Приложение отформатировано с помощью основного файла GUI.py, который создает объекты из ряда других файлов (многие из которых хранятся в подпапках, поскольку этот графический интерфейс заменяет утилиту командной строки, которая служила той же цели). Проблема, с которой я сталкиваюсь (как вы можете видеть в заголовке) заключается в том, что.exe выдает блок ошибок:

Трассировка (последний вызов был последним): файл "site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py", строка 11, в файле "c:\users\gurnben\anaconda3\envs\opencv\lib\site-packages\" PyInstaller\loader\pyimod03_importers.py", строка 389, в файле load_module exec(bytecode, module.Dict) Файл"site-packages\setuptools-20.7.0-py3.5.egg\pkg_resources__init__. Py ", строка 68, в файле "site-packages\setuptools-20.7.0-py3.5.egg\pkg_resources\extern__init__.py", строка 60, в load_module ImportError: требуется пакет 'package'; обычно это связано с этим пакетом, поэтому, если вы получите это предупреждение, обратитесь к упаковщику вашего дистрибутива. Не удалось выполнить скрипт pyi_rth_pkgres

Когда я смотрю на warn.txt, он дает огромный список отсутствующих пакетов, включая части некоторых пакетов, которые на самом деле находятся в пакете одной папки.
Я, однако, успешно получил его для распознавания файлов DLL из opencv, и он не указан среди пропавших без вести (как и ffmpeg, однако я не видел никаких файлов ffmpeg в папке). Мне пришлось указать собственный путь, чтобы включить в него файлы opencv, так как в данный момент их нет в anaconda.

Любые советы или идеи для следующих шагов по устранению неполадок? Я очень благодарен за всю вашу помощь и могу загрузить любой код, файлы и т. Д., Которые помогут вам диагностировать проблему. А пока я сам продолжу искать решение!

10 ответов

Такая же проблема здесь:

  • ОС: Win10
  • Python: 3.7
    • pyinstaller установлен pip install pyinstaller

исправить с помощью (то же решение, что и выше, без необходимости загрузки):

pip uninstall pyinstaller
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip

Расширение Vikash Kumar's ответ, создайте приложение, добавив --hidden-import argument to the command.

Например, у меня сработало выполнение приведенной ниже команды.

"pyinstaller --hidden-import=pkg_resources.py2_warn example.py"

обновление: добавлено отсутствует "="

Добавление строки:

import pkg_resources.py2_warn

моему коду помогло.

pyinstaller --hidden-import=pkg_resources.py2_warn --onefile example.py

вы можете использовать это, действительно, это работает, нет необходимости устанавливать или удалять что-либо, просто используйте это, он создаст только один файл, ниже код не будет создавать черное окно также, если вы создаете приложение Tkinter в основном

 pyinstaller --hidden-import=pkg_resources.py2_warn --onefile --noconsole example.py

Чтобы продолжить поиск лучшего скрытого ответа от Элтона Фернандо.

# -*- mode: python ; coding: utf-8 -*-
from kivy_deps import sdl2, glew
import pkg_resources.py2_warn # before you add it to hiddenimports, import it here.
import dependency_injector.errors
import six
block_cipher = None


a = Analysis(['...'],
             pathex=['..'],
             binaries=[],
             datas=[],
             hiddenimports=['pkg_resources.py2_warn', 'dependency_injector.errors', 'six'], # This is the line you need
             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='...',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
                Tree('./'),
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False,
               upx=True,
               upx_exclude=[],
               name='...')

Всякий раз, когда вы сталкиваетесь с ошибкой импорта, просто импортируйте их вверху и добавляйте в виде строки к скрытым импортам в массиве.

У меня такая же проблема. Была решена путем переустановки pyinstaller с версией ветки разработчика, следуя указаниям в: https://github.com/pyinstaller/pyinstaller/issues/2137

Шаги:

  • Удалить PyInstaller pip uninstall pyinstaller,
  • Загрузите почтовый индекс от github.
  • Распакуйте файл.
  • Убедитесь, что вы находитесь в каталоге с "setup.py" и запустите: python setup.py install

Выражаю @ Vikash-Кумар ответ.
Инструмент pyinstaller имеет параметр командной строки--hidden-import.

Для меня это решает проблему с темой.

Дополнительная информация:
https://web.archive.org/web/20200601130821/https://pyinstaller.readthedocs.io/en/stable/when-things-go-wrong.html.

Это потому, что он не копировал зависимость. Я решил вот так.

  • pyinstaller my_program.py

это создает my_program.spec. это базовый файл конфигурации.

откройте его любым текстовым редактором. ищи

hiddenimports=[]

редактировать в.

hiddenimports=["pkg_resources.py2_warn"]

теперь давайте вызовем pyinstaller, передающий наш настроенный файл вместо нашей программы

  • pyinstaller my_program.spec

Я попробовал все ответы выше, но это не сработало. В моем случае (pyinstaller==6.0.0) это решило проблему. Судя по всему, поведение последней версии pyinstaller несовместимо со старыми версиями.

      pip uninstall pyinstaller
pip install pyinstaller==5.13.2

Указание правильного пути к site_packages решило для меня проблемы. Первоначально я указывал путь к сайтам-пакетам из моей локальной пользовательской среды. Несмотря на то, что при нескольких --hidden-import exe-файл продолжал завершаться с ошибкой «Не удалось выполнить скрипт 'pyi_rth_pkgres' из-за необработанного исключения!» и искал пакет харако. Затем перешел на глобальный путь к сайтам-пакетам, снова собрал пакет, и все заработало. Ниже приведена команда для справки.

      pyinstaller --exclude-module PyQt5 -p dataLoader_cy.py --hidden-import dataLoader_cy -p C:\ProgramData\Anaconda3\Lib\site-packages --hidden-import=torchvision --hidden-import=numpy --hidden-import=pkg_resources.py2_warn --hidden-import=packaging --hidden-import=pkg_resources --hidden-import=packaging.version --hidden-import=packaging.specifiers --hidden-import=packaging.requirements --hidden-import=pkg_resources._vendor.jaraco --onefile main.py 
Другие вопросы по тегам