3

好的,我有一个旧的 Debian 虚拟机。包管理器是无用的。不,我不会更新操作系统。

我在我的系统上正确安装了 bzip2 库和开发头文件(这些实际上来自一个包)。

我从系统上绝对没有 Python 开始。我手动删除了所有内容。我下载了 Python 2.7.5 源代码,并配置了./configure --prefix=/usr. 它配置得很好。我运行make,它编译得很好。我尝试./python -c "import bz2; print bz2.__doc__",它有效,并说:

python bz2 模块为 bz2 压缩库提供了一个全面的接口。它实现了完整的文件接口、单次(解)压缩功能以及用于顺序(解)压缩的类型。

然后我运行make test,整个测试套件进展顺利,特别是“test_bz2”测试通过。

然后我运行make install,它将我的新 Python 二进制文件安装到 /usr/bin/ 中,就像我想要的那样。

我尝试/usr/bin/python -c "import bz2; print bz2.__doc__",它失败了:

Traceback(最近一次调用最后一次):文件“”,第 1 行,在 ImportError 中:没有名为 bz2 的模块

我尝试了很多不同的东西,包括构建 Python--enable-shared和不构建 Python,没有运气。我已经尝试了至少 10 次(每次完全清理所有东西,运行make distclean等)。没运气。

我试过了:PYTHONPATH="/usr/lib/python2.7"; export PYTHONPATH。仍然没有运气。

但是,如果我删除为 /usr/bin/python 创建的符号链接,make install而是这样做:ln -s /path/to/my/python/compile/python python,现在它神奇地起作用了。

那么,到底是什么?为什么我创建的这个 Python 二进制文件只能在编译目录中存在二进制文件时才能找到东西,而不是当它被放入正常的生产安装位置时?我错过了什么?

在整个过程中,我都是 root,从configuremake尝试make install测试 Python 导入调用。

我再次从头开始(这次是用--enable-sharedbtw 编译),并验证不仅在编译目录中存在build/lib.linux-x86_64-2.7/bz2.so,而且一旦我运行make install,该文件就会被放入/usr/lib/python2.7/lib-dynload/bz2.so.

我试图对 lib-dynload 进行一些阅读,但无法确定是否还有其他 Python 程序(如 CLI 的默认配置或其他)需要能够告诉它拉模块导入来自 lib-dynload,或者如果有其他地方或选项可以告诉make install它应该放在哪里而不是 dynload。

我仍然没有解释为什么/path/to/compilation/python二进制文件可以找到并加载bz2.so正常,但/usr/bin/python二进制文件找不到(或加载)/usr/lib/python2.7/lib-dynload/bz2.so

我想这可能与安装没有像/usr/lib/python符号链接那样创建指向/usr/lib/python2.7目录的事实有关。但是我创建了符号链接,但仍然不行。

我仍然迷失在这里。

4

1 回答 1

2

似乎是通过一长串 Twitter 对话意外得出了一种无答案的答案。

我在这里提出了另一个 Stack Overflow 问题,问为什么我们找到了解决这个问题的方法:https ://stackoverflow.com/questions/17662091/python-installation-prefix-not-being-persisted-in-config

为了子孙后代,现在的解决方案是我必须将PYTHONHOME环境变量设置为/usr,然后一切都开始工作了。令人费解的部分是文档说 PYTHONHOME 应该默认为 {prefix},我在配置为/usr. 那么为什么我必须手动设置呢?

运行python-config --prefix显示 {prefix} 默认值实际上/usr/bin不是/usr我指定的,这导致我需要将默认值覆盖回默认值,这很奇怪。

于 2013-07-15T19:27:58.360 回答