在Linux下使用NumPy的PyInstaller

时间:2015-09-25 19:00:14

标签: python linux numpy pyinstaller

我正在尝试将我的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建议,但没有任何帮助,我总是得到这个错误。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

这是我在hithub上发现的:

  

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

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

希望能帮助别人。