32位Linux上的PyInstaller - ImportError:需要'six'包

时间:2016-01-21 10:42:41

标签: linux pyinstaller six

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

我正在尝试打包它的系统是:

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

在所有这些系统上,当运行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”IS,由软件包管理器和Pip确认。它位于“/usr/local/lib/python2.7/dist-packages/”。我猜PyInstaller由于某种原因无法找到它(因为,我相信,如果所有内容都正确打包,它就不必在运行可执行文件的系统上。)
  4. 所以,我的问题非常典型,可能会导致PyInstaller的这个问题(以防万一,我为它运行“setup.py install”),以及如何解决/修复它?

    谢谢!

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

3 个答案:

答案 0 :(得分:8)

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

简而言之,从最初的问题开始,我做到了这一点:

  1. 使用'pip'安装'包装':

    sudo pip install packaging

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

    导入六个

    导入包装

    import packaging.version

    import packaging.specifiers

  3. (添加的所有导入都是反复试验,直到PyInstaller制造的可执行文件最终有效为止。)

    看起来有点黑客,因为使64位Linux的可执行文件不需要任何这些导入,但至少它现在可以工作,并且可执行文件大小基本上不受影响。

答案 1 :(得分:3)

对于以下设置(anaconda):

window.addEventlistener("load",test,false);
window.addEventlistener("message",test,false);
var counter=0;
 function test(event){
  counter++;
  if(counter==2){
   //two event listeners called
  }
 }

以下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")

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

pip install packaging

答案 2 :(得分:0)

我有类似的问题。尝试添加&#34;六&#34;以及&#34; kivy&#34;到spec文件中的hidden_​​packages。如果它不起作用,请确保在其19.2版本中安装了setuptools。在Windows上,这对我来说似乎是个问题。希望它有所帮助。