好的,我有一个旧的Debian VM。包管理器没用。不,我不打算更新操作系统。
我的系统上正确安装了bzip2 lib和开发头文件(实际上是来自软件包)。
我从系统上绝对没有Python开始。我手动删除了一切。我下载了Python 2.7.5源代码,并使用./configure --prefix=/usr
进行了配置。它配置很好。我运行make
,它编译得很好。我试试./python -c "import bz2; print bz2.__doc__"
,它有效,并说:
python bz2模块提供了全面的界面 bz2压缩库。它实现了一个完整的文件 接口,单击(解)压缩功能和类型 顺序(de)压缩。
然后我运行make test
并且整个测试套件进展顺利,特别是“test_bz2”测试通过。
然后我运行make install
,它将我的新Python二进制文件安装到/ usr / bin /就像我想要的那样。
我尝试/usr/bin/python -c "import bz2; print bz2.__doc__"
,但失败了:
追踪(最近一次通话): 文件“”,第1行,in ImportError:没有名为bz2的模块
我尝试了很多不同的东西,包括将Python构建为--enable-shared
而不是,没有运气。我已经尝试了至少10次(每次完全清理所有内容,运行make distclean
等)。没有运气。
我试过了:PYTHONPATH="/usr/lib/python2.7"; export PYTHONPATH
。仍然没有运气。
然而,如果我删除make install
为/ usr / bin / python创建的符号链接,而是执行:ln -s /path/to/my/python/compile/python python
,现在它神奇地起作用。
那么,到底是什么?为什么我创建的这个Python二进制文件只能在编译目录中存在二进制文件时找到东西,而不是当它被放入正常的生产安装位置时?我错过了什么?
我在整个过程中都是root用户,从configure
到make
再到make install
,尝试测试Python导入调用。
我已经从头开始了(这次用--enable-shared
btw进行编译),并验证不仅在编译目录中有build/lib.linux-x86_64-2.7/bz2.so
,而且一旦我运行make install
,文件放入/usr/lib/python2.7/lib-dynload/bz2.so
。
我已经尝试过对lib-dynload进行一些阅读,但是还无法确定是否还有其他Python程序(如CLI的默认配置或其他)需要能够告诉它pull模块从lib-dynload导入,或者如果有其他地方或选项告诉make install
它应该放在哪里而不是dynload。
我仍然无法解释为什么/path/to/compilation/python
二进制文件可以找到并加载bz2.so
,但/usr/bin/python
二进制文件无法找到(或加载)/usr/lib/python2.7/lib-dynload/bz2.so
。< / p>
我想也许这与安装不会像/usr/lib/python
符号链接创建指向/usr/lib/python2.7
目录这一事实有关。但是我创建了符号链接但仍然没有。
我仍然迷失在这里。
答案 0 :(得分: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
,这导致我需要将默认值覆盖回默认值,奇怪的是