7

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

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

4

3 回答 3

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,那么 Ubuntulibpython2.7软件包显然无法工作——或者它可以通过安装第二个python2.7. 无论哪种方式,都不要这样做。要么为现有的 2.7 获取 Python 的其余部分,要么卸载该 2.7 并使用 Ubuntu 软件包。(对于某些 Python 发行版,“获取其余部分”是不可能的,因为如果您安装共享库,您将获得动态链接的 Python 可执行文件而不是静态链接的可执行文件。在这种情况下,您几乎必须卸载并重新安装。)

其次,您可以使用PyInstaller's static-lib 支持。有关详细信息,请参阅票 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 表。

于 2013-02-04T00:03:00.247 回答
1

正如@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
于 2015-09-16T15:06:39.617 回答
1

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

于 2015-07-15T09:00:24.267 回答