【问题标题】:PyInstaller with NumPy under LinuxLinux 下带有 NumPy 的 PyInstaller
【发布时间】:2015-12-23 16:26:52
【问题描述】:

我正在尝试将我的 Python 程序转换为适用于 Windows 和 Linux 的独立可执行文件。 PyInstaller 似乎是完成这项任务的一个很好的解决方案。它在 Windows 下很容易转换,但是我不能让它在 Linux 上工作(在两台不同的 Ubuntu 机器上探测它)。原来的 Python 程序可以简化为简单的两行代码:

from numpy import log
print '%8.6f' % log(5)

这样调用时效果很好:

anton@op:~/bin$ python test_numpy.py
1.609438

在 PyInstaller 中编译后,它给了我这个错误:

anton@op:~/bin/dist/test_numpy$ ./test_numpy
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller-2.1-py2.7.egg/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/anton/bin/build/test_numpy/out00-PYZ.pyz/numpy", line 153, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller-2.1-py2.7.egg/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/anton/bin/build/test_numpy/out00-PYZ.pyz/numpy.add_newdocs", line 13, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller-2.1-py2.7.egg/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/anton/bin/build/test_numpy/out00-PYZ.pyz/numpy.lib", line 8, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller-2.1-py2.7.egg/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/anton/bin/build/test_numpy/out00-PYZ.pyz/numpy.lib.type_check", line 11, in <module>
  File "/usr/local/lib/python2.7/dist-packages/PyInstaller-2.1-py2.7.egg/PyInstaller/loader/pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "/home/anton/bin/build/test_numpy/out00-PYZ.pyz/numpy.core", line 6, in <module>
ImportError: cannot import name multiarray

所以问题与未正确导入 numpy 库有关。

我已尝试按照 pyinstaller 的建议添加隐藏挂钩,但没有任何帮助,而且我总是收到此错误。有什么想法吗?

【问题讨论】:

  • 单文件可执行文件不是 linux 方式。制作一个带有依赖项的 deb 包。
  • 感谢您的评论,但我不会制作单文件版本。我知道这不是完美的方法,但我需要制作一个多平台易于安装的单机版。为什么 PyInstaller 不接受 numpy 的任何想法?我什至尝试重新安装python和numpy,但仍然是同样的问题。

标签: python linux numpy pyinstaller


【解决方案1】:

我终于能够解决这个问题了。

这是我在hithub上找到的:

PyInstaller 构建的可执行文件不是完全静态的,因为它仍然依赖于系统 libc。在 Linux 下,GLIBC 的 ABI 是向后兼容的,但不是向前兼容的。因此,如果您链​​接到较新的 GLIBC,则无法在较旧的系统上运行生成的可执行文件。提供的二进制引导加载程序应该适用于较旧的 GLIBC。但是,libpython.so 和其他动态库仍然依赖于较新的 GLIBC。解决方案是在您拥有的最旧系统上编译 Python 解释器及其模块(也可能是引导加载程序),以便它与最旧版本的 GLIBC 链接。

看来当前稳定的 PyInstaller 版本可能已经过时了。由于降级所有软件包不切实际,我将 PyInstaller 升级到最新的开发版本(3.0.dev2),瞧!现在一切正常,所有依赖项都正确处理,没有任何自定义挂钩。

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多