PyInstaller在生成二进制时找不到libpython2.7.so?

7 投票
3 回答
15845 浏览
提问于 2025-04-17 14:38

我正在尝试在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。系统上有其他版本的Python,但我已经设置好使用:

alias python="python2.7"

在我使用的服务器上,只有 /usr/lib/python2.6,没有 /usr/lib/python2.7,但我经常使用python 2.7,并且它是可以正常工作的,所以我不明白为什么找不到它的库会成为问题。这里有一个 /usr/local/lib/libpython2.7.a

3 个回答

1

这里有两个选择:你的系统上要么有libpython*.so这个文件,要么没有。你可以从根目录开始,用任何查找工具来检查一下。如果这个文件已经存在,但PyInstaller还是找不到它,最简单的建议就是打开PyInstaller的代码,找到负责查找这个库的模块。你可以用简单的编辑器来完成这个操作。然后去这个模块,修改一下,看看你的系统出了什么问题。代码很简单,理解起来大概只需要5分钟。在我的情况下,我只是把LD_LIBRARY_PATH=/usr/local/lib加到我的用户配置文件(.bash_profile)里,并确保这个*.so文件在里面。如果你的系统上没有这个文件,或者版本不对,那就重新安装Python吧。

2

正如@abarnert所说,这个问题看起来是因为Python的静态编译导致的。要解决这个问题,需要重新编译Python,但这次要加上一个标志--enable-shared

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

完成这个步骤后,你会在/usr/local/lib这个路径下找到所需的库文件(libpython2.7.so.1.0),所以别忘了把这个文件夹添加到$LD_LIBRARY_PATH环境变量中:

    [root@machine tmp]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
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获取其他部分,要么卸载这个2.7并使用Ubuntu的包。(对于某些Python发行版来说,“获取其他部分”是不可能的,因为如果你安装共享库,你会得到一个动态链接的Python可执行文件,而不是你现在的静态链接版本。在这种情况下,你基本上必须卸载并重新安装。)

第二,你可以使用PyInstaller的静态库支持。具体细节可以查看ticket 420,简单来说,如果这个功能被启用,而PyInstaller认为你的平台应该有libpython2.7.so但找不到,它会寻找libpython2.7.a并静态链接那个。上次我需要这个功能时,它还没有合并到主干。从快速浏览这个票据来看,补丁现在似乎已经包含在内,但在默认的PyInstaller构建中是禁用的,里程碑设定在3.0,所以你可能仍然需要手动构建PyInstaller才能让它工作。

最后一件事:你可能确实有libpython2.7.so,但它可能安装在一些奇怪的地方,比如/opt/python27/lib,而/opt/python27并不在你的路径中,但/usr/local/bin/python27可以找到它,因为它是专门构建来从/opt/python27获取东西的。这种情况通常只对使用MacPorts或Fink的Mac用户有问题,而不是Linux用户,但也不是不可能。如果你觉得这可能是问题,可以查看/usr/local/bin/python27的dl表。

撰写回答