如何将bz2分配给Python的altinstall版本?

6

我正在使用自带Python 2.4的Redhat 5.8版本,但是我需要使用一个要求Python 2.6或更高版本的Python包。因此,我安装了Python 2.7与2.4并存,以免破坏系统版本。

现在,我正尝试通过pip安装一个包,但出现以下错误:

CompressionError: bz2 module is not available

然而,我在我的电脑上有该模块,当我这样做时,服务器版本会给出:

[~]$ 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.

并且2.7安装以这种方式出现错误:

[~]$ python2.7 -c "import bz2; print bz2.__doc__"
 Traceback (most recent call last):
  File "<string>", line 1, in <module>
 ImportError: No module named bz2

所以,我已经阅读了这些问题:已安装和这个非常好的一个, 但是这两个都不太合适。在第一种情况下,建议安装缺失的部分,在第二个问题中,要删除(或停止引用)额外的python安装。

我想做的是放置一个符号链接或类似的东西,以便python 2.7安装知道bz2在哪里,这样我就可以使用pip来安装python包。

谢谢, B


编辑:更多信息

经过大量研究,似乎在Python 2.5中建立路径变量的方式发生了巨大变化(可能是为什么Red Hat没有更新的原因)。

所以,在Python 2.7中,您可以通过在此文件夹中添加一个扩展名为.pth的文件来添加PYTHONPATH变量:

/usr/local/lib/python2.7/site-packages/

我已经尝试了两种方法来使其正常工作。

首先,我只是将一些 Python 2.4 路径文件提供给了 2.7。这导致了不同类型的错误:

[~]$ python2.7 -c "import bz2; print bz2.__doc__"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: /usr/lib64/python2.4/lib-dynload/bz2.so: undefined symbol: Py_InitModule4

好的,我会尽力而为。

我还尝试将路径指向/usr/lib/目录中的libbz2.so文件,但结果是熟悉的错误:

[~]$ python2.7 -c "import bz2; print bz2.__doc__"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named bz2

我仍然感到困惑,但我觉得我正在接近答案。

我真的需要一些有经验的编程环境设置人员的建议。我更喜欢只编写代码 :)


第一个是正确的修复方法。你的修复方法实际上并不是任何一种修复方法,因为它使用了完全不同版本的Python库。 - Ignacio Vazquez-Abrams
第一个是正确的吗?第一个答案? - GMBill
3个回答

7
昨天我在同一平台上成功地完成了这个操作。以下是我的步骤:
设置CFLAGS="-I/path/to/bz2/include"LDFLAGS="-L/path/to/bz2/lib"。确保在LD_LIBRARY_PATH中设置了bz2库路径。不过,你可能需要进行make distcleanconfigure && make && make install
如果失败了,可以直接编辑setup.py并进行类似以下替换:
# Gustavo Niemeyer's bz2 module.
if (self.compiler.find_library_file(['/home/someuser/packages/libbz2/lib'], 'bz2')): #lib_dirs, 'bz2')):

注意第二行末尾被注释掉的部分是 setup.py 原始代码的其余部分。

此外,我发现只需下载最新版本的 bz2 并将上述所有内容指向该版本即可,比尝试让系统已安装的版本正常工作更容易。

无论如何,这绝对有效。我昨天就试过了 :)


嗨jknupp,非常感谢你的帮助。不幸的是,我不知道如何设置不同的FLAGS。那我要重做什么?Python还是bzip? - GMBill
我找到了一篇教程,详细介绍了这个过程:这里 - GMBill
设置标志取决于您使用的 shell(它们是环境变量,不同的 shell 有不同的设置方法)。例如,在 bash/zsh 中,它将是 "export CFLAGS="...",其中省略部分是您要设置的值。 - jeffknupp
将LD_LIBRARY_PATH设置为什么?我还无法理解。 - DunkOnly
LDFLAGS和LD_LIBRARY_PATH是一样的。根据“stackoverflow.com/questions/23548188/how-do-i-compile-python-3-4-with-custom-openssl”网站。 - DunkOnly

2
其他提供的答案很有用和有帮助,但这是我让它工作的方法。
问题不在于Python找不到文件(正如我所想的那样),而是无法正确使用它们。因此,我进入了bzip2的Makefile中,找到了看起来像这样的行:
CFLAGS= -Wall -Winline -O2 -g $(BIGFILES)

并在该行中添加了-fPIC:

CFLAGS=-fPIC -Wall -Winline -O2 -g $(BIGFILES)

然后,哇啦!它编译得非常好。


我想确认这是必要的步骤,因为您可以从Python安装过程中的make步骤看到:/usr/bin/ld: /usr/local/lib/libbz2.a(compress.o): relocation R_X86_64_PC32 against symbol stderr@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC`。 - progfan

1

任何时候,如果你使用的是系统安装之外的 Python 版本,我强烈建议使用 http://pypi.python.org/pypi/virtualenv。它会为你设置一个“沙盒”,其中包含自己的 Python 副本,并重新设置所有路径等,以指向新的副本。然后,你可以使用 pip 安装所需的任何软件包。


1
看起来很不错,但是我如何使用virtualenv设置另一个版本的Python? - GMBill
看来我提问太早了,这里有一个解释:[https://dev59.com/bXI_5IYBdhLWcg3wFu7L] - GMBill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接