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



我正试图在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

在我使用的服务器中,只有/usr/lib/python2.6,没有/usr/lib/pyton2.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的静态库支持。有关详细信息,请参阅票证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表。

正如@abarnert已经说过的,问题似乎是python的静态编译。为了解决这个问题,需要重新编译python,但添加标志——这次启用共享

    [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

有两个选项:libpython*.so在您的系统上存在或不存在。您可以通过从根目录开始的任何查找实用程序进行检查。如果文件已经存在,但PyInstaller仍然找不到:最通用的建议就是打开PyInstaller代码,找到负责查找此库的模块。它可以用简单的编辑器完成。然后转到本模块并编辑他,以了解您的特定系统有什么问题。代码简单且不成熟,您需要大约5分钟才能理解原因。在我的情况下,我只是将LD_LIBRARY_PATH=/usr/local/lib添加到我的用户配置文件(.bash_profile)中,并确保该*.so文件在其中。如果文件不在您的系统上,或者您的版本不正确:只需重新安装python即可。

最新更新