在制作二进制文件时,PyInstaller找不到libpython2.7.so?

时间:2013-02-03 21:11:56

标签: python python-2.7 python-module pyinstaller

我正在尝试在Linux上使用PyInstaller 2.0制作Python脚本的二进制版本。我跑的时候:

$ python pyinstaller.py myscript.py

我收到错误:

8907 INFO: Looking for Python library libpython2.7.so
Traceback (most recent call last):
...
  File "pyinstaller.py", line 91, in <module>
    raise IOError("Python library not found!")
IOError: Python library not found!

如何解决这个问题?

我正在使用:

Linux#98-Ubuntu x86_64 GNU / Linux

使用python 2.7。系统上还有其他的Pythons,但我已经设定了:

alias python="python2.7"

在我使用的服务器中,只有/usr/lib/python2.6而不是/usr/lib/python2.7但是python 2.7经常被我使用并且功能正常等等所以我不明白为什么它会是一个找到它的库的问题。有/usr/local/lib/libpython2.7.a

2 个答案:

答案 0 :(得分:6)

  

在我使用的服务器中,只有/usr/lib/python2.6而不是/usr/lib/python2.7但我经常使用python 2.7并且功能正常,所以我看不到为什么找到它的库会有问题。有一个/usr/local/lib/libpython2.7.a。

如果没有libpython2.7.so,当然找到该库会有问题。

你能够使用Python解释器的原因可能是它是静态链接的。

有两种方法可以解决这个问题。

首先,您可以为Python 2.7安装共享库。如果您使用的是旧版本的Ubuntu,例如Python 2.6,并且您从python2.7软件包安装了2.7,那么这只需要安装libpython2.7

如果您从其他来源获得了2.7,那么Ubuntu libpython2.7包显然无效 - 或者它可以通过安装python2.7的第二个副本来工作,可能会覆盖其中一些你已经拥有的文件,绝对让你感到困惑。无论哪种方式,都不要这样做。要么为现有的2.7获取剩余的Python,要么卸载2.7并使用Ubuntu包。 (对于某些Python发行版,“获取其余部分”是不可能的,因为如果安装共享库,则会获得动态链接的Python可执行文件而不是静态链接的文件。在这种情况下,您几乎必须卸载并重新安装。)

其次,您可以使用PyInstaller的static-lib支持。有关详细信息,请参阅ticket 420,但简单的想法是,如果启用此功能,并且PyInstaller认为您的平台应该有libpython2.7.so但找不到它,则会查找{{1}而且静态地链接它。上次我需要这个,它没有检查到主干。通过快速浏览一下故障单,看起来现在包含了补丁,但在默认的libpython2.7.a版本中已禁用,里程碑设置为3.0,因此,您可能仍需要手动构建PyInstaller让它发挥作用。

最后一件事:你可能有libpython2.7.so,但它只是安装在某个奇怪的地方,如PyInstaller或其他东西,/opt/python27/lib无处可见路径,但/opt/python27可以找到它,因为它是明确构建的,用于从/usr/local/bin/python27中获取内容。对于使用MacPorts或Fink的Mac用户而言,这种事情往往只是一个问题,而不是Linux用户,但这并非不可能。如果您认为这可能是问题,可以查看/opt/python27的dl表。

答案 1 :(得分:1)

正如@abarnert已经说过,问题似乎是python的静态编译。要解决此问题需要重新编译python,但这次添加标志 - enable-shared

Grouping

执行此操作后,您将在/ usr / local / lib路径下找到所请求的库( libpython2.7.so.1.0 ),因此请不要忘记将该文件夹添加到$ LD_LIBRARY_PATH环境变量:

    [root@machine ~]# ./configure --prefix=/usr/local --enable-shared
    [root@machine ~]# make && make altinstall