PyInstaller在制作二进制文件时找不到libpython2.7.so?
Posted
技术标签:
【中文标题】PyInstaller在制作二进制文件时找不到libpython2.7.so?【英文标题】:PyInstaller cannot find libpython2.7.so when making binary? 【发布时间】:2013-01-18 14:22:19 【问题描述】:我正在尝试在 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
。
【问题讨论】:
第一:您使用的是什么发行版(和版本)?你使用的是发行版的默认 python 包吗?你还有其他 Python 安装吗?实际上是否有/usr/lib/libpython2.7.so
(或您路径上的其他地方)? (通常有两个单独的 pythonX.Y 包,一个包含足以运行解释器的内容,一个包含编译 C 扩展所需的所有内容等,命名为 pythonX.Y-dev
,有时 libpythonX.Y
是后者。)
@abarnert:我编辑了我的问题来回答你的问题
如果您回答从哪里获得两个 Python 安装,那将非常有帮助。为什么 2.6 有 so
而 2.7 没有?但我会尽量用我的猜测来回答。
@abarnert:这两个 python 安装是由系统管理员安装在我们的集群上的,我自己没有安装它们。如果它有所作为,我可以,但我宁愿不这样做,因为安装的版本可以正常工作
好吧,如果他安装了python2.6
、libpython2.6
和python2.7
,但没有安装libpython2.7
,您需要自己安装最后一个。或者,如果他使用 Ubuntu 软件包以外的其他东西安装了 Python 2.7,那么您将需要处理它。如果安装的版本“工作正常”,你可以运行解释器,但不能运行PyInstaller
,而你需要PyInstaller
,那真的不能正常工作,对吧?
【参考方案1】:
在我使用的服务器中,只有 /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
的静态库支持。有关详细信息,请参阅ticket 420,但简单的想法是,如果启用此功能,并且 PyInstaller 认为您的平台应该有一个 libpython2.7.so
但找不到它,它将寻找一个 libpython2.7.a
并静态链接它.上次我需要这个时,它没有检入主干。快速浏览一下票证,现在似乎包含了补丁,但在默认 PyInstaller
构建中禁用,并且里程碑设置为 3.0,因此,您可能仍需要手动构建 PyInstaller
才能获得它工作。
最后一件事:您可能确实拥有 libpython2.7.so,但它只是安装在某个奇怪的地方,例如 /opt/python27/lib
或其他什么地方,/opt/python27
在您的路径上无处可寻,但 @ 987654335@ 可以找到它,因为它明确构建用于从/opt/python27
中获取内容。这种事情往往只对使用 MacPorts 或 Fink 的 Mac 用户来说是个问题,而不是 Linux 用户,但这并非不可能。如果您认为这可能是问题所在,可以查看 /usr/local/bin/python27
的 dl 表。
【讨论】:
你写“你可以为你的 Python 2.7 安装共享库”——我该怎么做呢?安装我自己的 Python 2.7 本地版本并使用它而不是全球可用的版本会更容易吗? 您阅读了该段的其余部分吗? “如果……您从 [Ubuntu]python2.7
软件包安装了 2.7,这应该只是安装 libpython2.7
的问题。”如果您从其他来源安装了 2.7,那么除非您告诉我您是如何安装的,否则我显然无法回答这个问题。
我确实做到了,但我仍然不知道如何安装 libpython 2.7。这是标准程序吗?我不能在 /usr/* 中安装任何东西,因为我不是这里的系统管理员。
@user248237: 好的,如果你不能让管理员安装libpython2.7
包,并且你不能使用 2.6,那么是的,你必须安装一个单独的副本用户目录中的 Python 2.7(并确保不要使用系统副本——处理时会有一些混乱)。您可能仍然可以使用apt
/dpkg
执行此操作(请参阅this question,或者您可以挥手从源代码安装。无论哪种方式,这可能是例如 superuser.com 或 askubuntu.com 的问题,而不是这样。【参考方案2】:
有 2 个选项:libpython*.so 在您的系统上存在或不存在。您可以通过从根目录开始的任何查找实用程序来检查它。如果文件已经存在但 PyInstaller 仍然找不到:最通用的建议是打开 PyInstaller 代码并找到负责找到该库的模块。它可以用简单的编辑器来完成。然后转到此模块并编辑他以了解您的特定系统有什么问题。代码很简单而且为时过早——你需要大约 5 分钟才能理解其中的原因。就我而言,我只是将 LD_LIBRARY_PATH=/usr/local/lib 添加到我的用户配置文件 (.bash_profile) 中,并确保此 *.so 文件在其中。如果文件不在您的系统上或者您的版本不正确:只需重新安装 python。
【讨论】:
【参考方案3】:正如@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
【讨论】:
有人说这个答案在某些时候没有用,你能解释一下为什么吗?它已经过测试,至少在一种类似的情况下,它实际上解决了这个问题中报告的错误,所以老实说我虽然它可能对某人有帮助。以上是关于PyInstaller在制作二进制文件时找不到libpython2.7.so?的主要内容,如果未能解决你的问题,请参考以下文章
获取 ValueError:使用 PyInstaller 模块时找不到脚本“/src/add2vals.py”
尝试调用 registerSource 时找不到 .rcc 文件
使用 Pyinstaller 制作的 Python Exe 试图从错误的位置找到 dll