好的,我有一个旧的Debian虚拟机。包管理器没用。不,我不会更新操作系统。在
我在我的系统上正确安装了bzip2库和开发头文件(它们实际上来自一个包)。在
我从系统上绝对没有Python开始。我手动移除了所有东西。我下载了Python2.7.5源代码,并配置了./configure --prefix=/usr
。它的配置很好。我运行make
,它编译得很好。我试着./python -c "import bz2; print bz2.__doc__"
,它起作用了,然后说:
The python bz2 module provides a comprehensive interface for the bz2 compression library. It implements a complete file interface, one shot (de)compression functions, and types for sequential (de)compression.
然后,我运行make test
,整个测试套件进展顺利,特别是“test_bz2”测试通过了。在
然后我运行make install
,它将新的Python二进制文件安装到/usr/bin/中,就像我想要的那样。在
我尝试/usr/bin/python -c "import bz2; print bz2.__doc__"
,但失败的原因是:
Traceback (most recent call last): File "", line 1, in ImportError: No module named 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二进制文件只能在二进制文件存在于编译目录中时才能找到内容,而当它被放入正常的生产安装位置时却不能?我错过了什么?在
在从configure
到{make install
到尝试测试Python导入调用的整个过程中,我都是root用户。在
我又从头开始了(这次是用--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的默认配置或其他什么)是否需要告诉它从lib dynload获取模块导入,或者如果有其他地方或选项告诉make install
它应该把它放在哪里而不是dynload。在
我仍然没有解释为什么/path/to/compilation/python
二进制文件可以找到并加载bz2.so
,但是{/usr/lib/python2.7/lib-dynload/bz2.so
。在
我想这可能是因为安装没有创建一个指向/usr/lib/python
目录的/usr/lib/python
符号链接。但我创建了符号链接,还是没有成功。在
我还是迷路了。在
似乎是通过一长串的Twitter对话意外地得到了某种无答案的答案。在
我在这里提出了另一个堆栈溢出问题,以询问为什么我们找到了这个问题的解决方案:https://stackoverflow.com/questions/17662091/python-installation-prefix-not-being-persisted-in-config
为了子孙后代的利益,现在的解决方案是我必须将时明确设置为默认值的。那我为什么要手动设置呢?在
PYTHONHOME
环境变量设置为/usr
,然后一切都开始工作。令人费解的是,文档中说PYTHONHOME应该默认为{prefix},这是我在配置到^{运行},而不是我指定的{},这导致我需要将默认值重写回默认值,这很奇怪。在
python-config prefix
会发现{prefix}默认值实际上是{相关问题 更多 >
编程相关推荐