Pyinstaller"无法执行脚本pyi_rth_pkgres"和丢失的包裹

时间:2016-06-14 14:49:51

标签: python opencv ffmpeg pyinstaller

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

  

追踪(最近一次通话):     文件" site-packages \ PyInstaller \ loader \ rthooks \ pyi_rth_pkgres.py",第11行,in     文件" c:\ users \ gurnben \ anaconda3 \ envs \ opencv \ lib \ site-packages \ PyInstaller \ loader \ pyimod03_importers.py",第389行,在load_module中       exec(字节码,模块。字典)     文件" site-packages \ setuptools-20.7.0-py3.5.egg \ pkg_resources__init __。py",第68行,in     文件" 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中。

下一个问题排查步骤的任何提示或想法?我非常感谢您提供的所有帮助,我可以上传任何有助于您诊断问题的代码,文件等。与此同时,我将继续自己寻找解决方案!

8 个答案:

答案 0 :(得分:39)

这里有同样的问题:

  • 操作系统:Win10
  • Python:3.7
      pyinstaller安装的
    • pip install pyinstaller

解决方法(与上述解决方案相同,无需下载):

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

答案 1 :(得分:32)

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

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

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

更新:添加了缺少的“ =“

答案 2 :(得分:10)

添加行:

import pkg_resources.py2_warn

对我的代码有帮助。

答案 3 :(得分:8)

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

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

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

答案 4 :(得分:6)

进一步遍历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='...')

每当遇到导入错误时,只需将它们导入顶部,然后将它们作为字符串添加到数组中的隐藏导入中即可。

答案 5 :(得分: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

答案 6 :(得分:3)

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

  • pyinstaller my_program.py

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

使用任何文本编辑器将其打开。搜索

hiddenimports = []

编辑为。

hiddenimports = [“ pkg_resources.py2_warn”]

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

  • pyinstaller my_program.spec

答案 7 :(得分:2)

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

步骤如下:

  • 删除PyInstaller pip uninstall pyinstaller
  • github
  • 下载邮政编码
  • 解压缩文件。
  • 确保您在" setup.py"的目录中并运行:python setup.py install