Pyinstaller“无法执行脚本pyi_rth_pkgres”和缺少包

Posted

技术标签:

【中文标题】Pyinstaller“无法执行脚本pyi_rth_pkgres”和缺少包【英文标题】:Pyinstaller "Failed to execute script pyi_rth_pkgres" and missing packages 【发布时间】:2016-10-15 09:13:20 【问题描述】:

这是我第一次在这里发布问题,因为我的大部分问题已经被其他人回答了!我正在使用 python 开发一个 GUI 应用程序,并尝试使用 pyinstaller 将其打包到一个文件夹和 .exe 中以便于移植。目前,我正在使用 windows 10 和 anaconda3 来管理我的 python 包。该应用程序依赖于 tkinter、pillow、numpy、scikit-learn、opencv、ffmpeg 和 matplotlib。该应用程序使用主 GUI.py 文件进行格式化,该文件创建许多其他文件的对象(其中许多文件存储在子文件夹中,因为此 GUI 正在替换用于相同目的的命令行实用程序)。我遇到的问题(正如您在标题中看到的那样)是 .exe 正在抛出错误块:

Traceback(最近一次调用最后一次): 文件“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(字节码,模块。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:需要“打包”包;通常这与此软件包捆绑在一起,因此如果您收到此警告,请咨询您的发行版的包装商。 执行脚本pyi_rth_pkgres失败

当我查看 warn.txt 时,它会提供大量丢失的包列表,其中包括一些实际位于单个文件夹包中的包的一部分。 但是,我已经成功地让它识别出来自 opencv 的 dll 文件,并且它没有在丢失的列表中列出(ffmpeg 也没有,但是我没有在文件夹中看到任何 ffmpeg 文件)。我必须传入一个自定义路径以使其包含 opencv 文件,因为它们此时不在 anaconda 中。

对于接下来的故障排除步骤有什么提示或想法吗?我非常感谢您提供的所有帮助,我可以上传任何有助于您诊断问题的代码、文件等。同时,我会继续自己寻找解决方案!

【问题讨论】:

更新:我已经重新打包,现在它实际上开始执行,然后抛出一个导入错误!至少进步!错误如下: ImportError: The 'packaging' package is required 好的,我相信手头的问题已经解决了,现在我遇到了文件引用问题... 我也遇到了,你是怎么解决的? 前一阵子,但我相信这是一些数据文件的依赖关系。我不得不修改 .spec 文件以包含这些文件和文件夹 【参考方案1】:

我遇到了同样的问题。通过使用开发人员的分支版本重新安装 pyinstaller 解决了,请按照以下说明进行操作:https://github.com/pyinstaller/pyinstaller/issues/2137

步骤如下:

删除 PyInstaller pip uninstall pyinstaller。 从github下载压缩包。 解压文件。 确保您在带有“setup.py”的目录中并运行:python setup.py install

【讨论】:

为什么 pypi 版本没有以某种方式更新。这就是我依赖github的原因。【参考方案2】:

同样的问题:

操作系统:Win10 Python:3.7 pyinstallerpip install pyinstaller 安装

通过(与上述相同的解决方案,无需下载)修复:

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

【讨论】:

不知何故pypi版本坏了。这就是我依赖github的原因【参考方案3】:

添加行:

import pkg_resources.py2_warn

对我的代码有帮助。

【讨论】:

这将如何解决问题中所述的问题? Python 中没有“隐藏模块”之类的东西,所以也许您可以详细说明 import this ... as hidden Module 是什么意思?【参考方案4】:

我扩展了 @vikash-kumar 答案pyinstaller 工具 有命令行参数--hidden-import

它为我解决了主题问题。

更多信息:https://web.archive.org/web/20200601130821/https://pyinstaller.readthedocs.io/en/stable/when-things-go-wrong.html#listing-hidden-imports。

【讨论】:

我担心链接现在坏了......我在pyinstaller.readthedocs.io/en/stable/hooks.html找到了一些安慰 @DarkLight TY。我忘记了互联网上的主要规则之一:所有链接都死了,除了 web.archive.org ^_^【参考方案5】:

扩展Vikash Kumar's 答案,通过添加--hidden-import argument to the command 来构建应用程序。

例如,运行下面给出的命令对我有用。

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

更新:添加了缺失的“=”

【讨论】:

【参考方案6】:

这是因为他没有复制依赖。我是这样解决的。

pyinstaller my_program.py

这将创建一个 my_program.spec。它是一个基本配置文件。

用任何文本编辑器打开它。搜索

hiddenimports=[]

编辑到。

hiddenimports=["pkg_resources.py2_warn"]

现在让我们调用 pyinstaller 传递我们的配置文件而不是我们的程序

pyinstaller my_program.spec

【讨论】:

【参考方案7】:
pyinstaller --hidden-import=pkg_resources.py2_warn --onefile example.py

你可以使用它真的不需要安装或卸载任何东西只需使用它只会创建一个文件,如果你主要创建 Tkinter 应用程序,下面的代码也不会创建黑色窗口

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

【讨论】:

【参考方案8】:

进一步迭代 elton fernando 的最佳隐藏答案。

# -*- 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='...')

每当遇到导入错误时,只需将它们导入顶部,并将它们作为字符串添加到数组中的 hiddenimports 中。

【讨论】:

以上是关于Pyinstaller“无法执行脚本pyi_rth_pkgres”和缺少包的主要内容,如果未能解决你的问题,请参考以下文章

pyinstaller打包动态库

PyInstaller 怎么在linux安装和使用

python 使用pyinstaller打包程序

用pyinstaller打包出现找不到指定的模块?

Python打包方法——Pyinstaller (python3)

利用pyinstaller 打包Python文件