【问题标题】:PyInstaller on 32-bit Linux - ImportError: The 'six' package is required32 位 Linux 上的 PyInstaller - ImportError: The 'six' package is required
【发布时间】:2016-04-27 13:32:05
【问题描述】:

我正在使用 Python2.7Kivy1.9.2-dev 制作程序,并尝试使用 PyInstaller-3.0 将其打包作为单个可执行文件用于不同的系统。

我试图为其打包的系统是:

  • 64 位 Linux Mint 17.3
  • 32 位 Linux Mint 17(在升级到 17.1 和 17.3 时也尝试过)
  • 32 位 Windows XP SP3
  • Raspbian(树莓派)

在所有这些系统上,只要使用未编译的 Python 运行,程序就可以正常运行。 (因此,所有 Kivy 依赖项也都很好)。

但是,在使用 PyInstaller 制作的可执行文件中,只有在 64 位 Linux 上制作的可执行文件作为一个文件工作。 Windows 和 Raspbian 可执行文件大部分都可以运行(我稍后会写到),但是在 32 位 Linux 上制作的那个仍然无法运行。运行时出现以下错误(我尝试在 32 位和 64 位 Linux 上运行它):

Traceback (most recent call last):
  File "<string>", line 11, in <module>
  File "/media/Data/Programming/Python/installers/PyInstaller-3.0/PyInstaller/loader/pyimod03_importers.py", line 363, in load_module
    exec(bytecode, module.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 48, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pkg_resources/extern/__init__.py", line 60, in load_module
ImportError: The 'six' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution.
pyi_rth_pkgres returned -1

这就是我的困惑:

  1. 在我的“/usr/local/lib/python2.7/dist-packages/”中没有“pkg_resources”文件夹,但上面的内容表明它显然存在……它甚至读取那里的文件成功地。它是在可执行文件启动时创建的吗?
  2. 我没有专门将“六”用于任何事情,在此错误之前我什至不知道它存在。
  3. “Six”安装在我的系统上,包管理器和 Pip 确认。它位于“/usr/local/lib/python2.7/dist-packages/”中。我猜 PyInstaller 出于某种原因找不到它(因为,我相信,如果一切都正确打包,则它不必存在于运行可执行文件的系统上。)

所以,我的问题很典型,什么可能导致 PyInstaller 出现这个问题(以防万一,我确实为它运行了“setup.py install”),以及如何解决/修复它?

谢谢!

PS:在旁注中,我提到了 Windows 和 Raspbian 可执行文件的问题。在 Windows 上,exe 仅在同一文件夹中存在“zlib1.dll”时运行(即使使用 PyInstaller 专门打包到 exe 中,它也不起作用),而在 Raspbian 上,我只有在不使用“ --onefile”(使用“--onefile”,似乎 PyInstaller 不会将任何 Python 二进制文件打包到可执行文件中,例如 libpython.2.7.so,也许还有其他)

【问题讨论】:

    标签: linux pyinstaller six


    【解决方案1】:

    我遇到了类似的问题。尝试将“六”和“kivy”添加到您的规范文件中的 hidden_​​packages。如果它不起作用,请确保 setuptools 安装在其 19.2 版本中。这似乎是我在 Windows 上的问题。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      好吧,正如 Clement 建议的那样,在隐藏包中添加“六”并没有奏效,而是开始了一系列的反复试验,最终得出了一个解决方案。 在使用“hiddenimports”进行测试后不起作用,我尝试将“六”导入到我的 Python 代码中。并且编译的可执行文件不再显示此错误!但是,它现在说需要名为“packaging”的包......我没有安装。

      简而言之,从最初的问题开始,我是这样做的:

      1. 使用“pip”安装“包装”:

        sudo pip 安装打包

      2. 将这些导入添加到我的主要 Python 代码中:

        导入六个

        进口包装

        导入包装.版本

        导入包装说明符

      (添加的所有导入都是反复试验,直到 PyInstaller 生成的可执行文件最终工作为止)。

      似乎有点 hack-y,因为为 64 位 Linux 制作可执行文件不需要任何这些导入,但至少它现在可以工作,并且可执行文件大小基本上不受影响。

      【讨论】:

        【解决方案3】:

        对于以下设置(anaconda):

        PyInstaller: 3.2
        Python: 3.5.2
        Platform: Windows-10-10.0.10240-SP0
        Numpy: 1.11.1
        

        还有以下mwe.py

        import numpy
        print ("hello world")
        

        我必须执行以下操作来修复:

        pip install packaging
        

        使用以下 bat 文件构建(^ 是 BAT 行的延续):

        pyinstaller --noconfirm ^
                --hidden-import six ^
                --hidden-import packaging ^
                --hidden-import packaging.version ^
                --hidden-import packaging.specifiers ^
                --hidden-import packaging.requirements ^
                mwe.py
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-17
          • 1970-01-01
          • 2022-08-18
          • 2018-10-23
          • 1970-01-01
          • 2013-05-19
          • 2021-09-12
          • 2023-03-25
          相关资源
          最近更新 更多