我正在使用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 树莓派
- (树莓派)
在所有这些系统上,程序在与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
这是我感到困惑的地方:
- 在我的"/
- usr/local/lib/python2.7/dist-packages/"中没有"pkg_resources"文件夹,但上面表明它显然在那里......它甚至可以成功读取那里的文件。它是在可执行文件启动时创建的吗?
- 我没有专门使用"六"来表示任何事情,在此错误之前,我什至不知道它的存在。
- "六个"安装在我的系统上,正如包管理器和 Pip 所确认的那样。它位于"/usr/local/lib/python2.7/dist-packages/"中。我猜 PyInstaller 由于某种原因找不到它(因为我相信,如果所有内容都正确打包,它不必存在于运行可执行文件的系统上。
所以,我的问题非常典型,什么可能导致 PyInstaller 出现此问题(以防万一,我确实为它运行了"setup.py 安装"),以及如何解决/修复它?
谢谢!
PS:附带说明一下,我提到了Windows和Raspbian可执行文件的问题。在 Windows 上,exe 仅在同一文件夹中存在"zlib1.dll"时才运行(即使使用 PyInstaller 专门打包到 exe 中,它也不起作用),而在 Raspbian 上,我只让程序在不使用"--onefile"的情况下工作(使用"--onefile",似乎 PyInstaller 不会将任何 Python 二进制文件打包到可执行文件中,比如 libpython.2.7.so,也许还有其他
好吧,正如克莱门特所建议的那样,将"六"添加到隐藏包中并没有奏效,而是开始了一系列的试错,最终导致了解决方案。在使用"hiddenimports"的测试不起作用后,我尝试将"六"导入我的 Python 代码中。并且编译的可执行文件不再显示此错误!但是,它现在说需要名为"包装"的包装......我没有安装。
简而言之,从最初的问题开始,我这样做了:
使用"pip"安装"包装":
须藤点安装打包
将这些导入添加到我的主要 Python 代码中:
进口六
进口包装
导入打包版本。
进口包装说明符
(添加的所有导入都是反复试验,直到 PyInstaller 制作的可执行文件最终起作用)。
似乎有点黑客,因为为 64 位 Linux 制作可执行文件不需要任何这些导入,但至少它现在可以工作了,可执行文件大小基本上不受影响。
对于以下设置(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
我也有类似的问题。尝试将"六"和"kivy"添加到规范文件中的hidden_packages中。如果它不起作用,请确保安装工具已安装在其 19.2 版本中。这似乎是我在Windows上的问题。希望对您有所帮助。