好的,我有一个旧的Debian。包管理器是无用的。不,我不会更新操作系统。
我在我的系统上正确地安装了bzip2库和开发头(它们实际上来自一个包)。
我从系统上绝对没有Python开始。我手动删除了所有东西。我下载了Python2.7.5源代码,并配置了./configure --prefix=/usr。它配置得很好。我运行make,它编译得很好。我试着使用./python -c "import bz2; print bz2.__doc__",它可以工作,并说:
python bz2模块为bz2压缩库提供了一个全面的接口。它实现了一个完整的文件接口、一个de压缩函数和用于顺序(De)压缩的类型。
然后我运行make test,整个测试套件进展良好,特别是"test_bz2“测试通过了。
然后我运行make install,它按照我的意愿将新的Python二进制文件安装到/usr/bin/中。
我尝试了/usr/bin/python -c "import bz2; print bz2.__doc__",但是它失败了:
回溯(最近一次调用):File "",第1行,在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二进制文件只有当二进制文件存在于编译目录中,而不是放到正常的生产安装位置时才能找到呢?我遗漏了什么?
我是整个过程中的根用户,从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的默认配置等)是否需要告诉它从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目录的事实有关。但我创造了符号链接,但仍然没有成功。
我还是迷失在这里。
发布于 2013-07-15 19:27:58
似乎有一种不回答的答案是通过一长串推特对话偶然得到的。
我在这里提出了另一个堆栈溢出问题,以问为什么我们发现了这个问题的解决方案:https://stackoverflow.com/questions/17662091/python-installation-prefix-not-being-persisted-in-config
为了后代起见,现在的解决方案是,我必须将PYTHONHOME环境变量设置为/usr,并且一切都开始工作。令人费解的是,文档中说PYTHONHOME应该默认为{前缀},在配置为/usr期间,我显然将其设置为默认值。那么,为什么我必须手动设置它呢?
运行python-config --prefix会发现,{前缀}的默认值实际上是/usr/bin,而不是我指定的/usr,这导致我需要将默认值重写回默认的,奇怪的是。
https://stackoverflow.com/questions/17608352
复制相似问题