如何在Ubuntu 12.04上隔离Python 2.7.X,而系统默认安装的是Python 2.7.3?

我想在我的Ubuntu 12.04机器上构建Python 2.7.8,该机器默认安装了Python 2.7.3。我希望完全隔离Python 2.7.8,不与分发的默认Python产生任何干扰,包括通过apt-get或PIP安装的模块。

我想从源代码进行安装,并且不想使用virtualenv - 我宁愿先用较为复杂的方法学习,然后再使用更高级的工具。

这个问题的第二个相关部分是,在我安装了Python 2.7.8之后,如何同时拥有两个不同的PIP,一个默认安装Python模块到Python 2.7.3,另一个安装模块到Python 2.7.8?

谢谢。


1我认为这不是一个重复的问题的区别在于问题的第二部分,它与其他要求完全隔离安装(即也包括模块)的问题不同。如果我在讨论3.0和2.7.3之间的区别,那就是一回事,但是,例如,如果我想安装2.7.3、2.7.5和2.7.8,我不确定我能否使用提出的方法来实现。我对此还是个新手,所以可能完全错了... - jpf
@bodhi.zazen编辑以尝试澄清与可能的重复之间的区别 - jpf
2个回答

首先,为了确保我从一个干净的状态开始,我采取了以下步骤:
- 通过使用命令`sudo apt-get uninstall python-xlwt`和`pip uninstall xlwt`卸载软件包`xlwt`(用于测试) - 通过使用命令`sudo apt-get uninstall python-pip`卸载PIP - 通过使用命令`make clean`创建一个干净的Python源代码目录(~/src/Python2.7.8) - 通过使用命令`which pip`确保PIP不可用(结果为空)
为了构建Python 2.7.X并确保PIP仅配置给该特定安装版本。
  • (假设已经下载并解压到主目录,比如~/src/Python2.7.8
  • 创建两个目录用于--prefix--exec-prefix配置选项,比如~/bld/python2.7.8_ind~/bld/python2.7.8_dep
  • 进入源代码目录(例如~/src/Python2.7.8)并输入以下命令:

    ./configure --prefix=/home/uname/bld/python2.7.8_ind --exec-prefix=/home/uname/bld/python2.7.8_dep
    
  • 输入make && make install

二进制的python(或者一个指向二进制的符号链接)在这个例子中位于/home/uname/bld/python2.7.8_dep/bin。
使用这个二进制文件来安装pip,通过输入~/bld/python2.7.8_dep/bin/python get-pip.py,下载地址为https://bootstrap.pypa.io/get-pip.py
这将在~/bld/python2.7.8_ind中创建一个之前不存在的目录bin,并将PIP可执行文件放置在其中,用于此特定安装。PIP软件包被放置在~/bld/python2.7.8_ind/lib/python2.7/site-packages中(之前只有一个README文件)。
现在,要将第一个软件包安装到这个特定的python安装中,
我验证了目录~/bld/python2.7.8_ind/lib/python2.7/site-packages只包含在PIP安装过程中添加的软件包(pip,setuptools,easy_install)。
现在,输入 ~/bld/python2.7.8_dep/bin/pip install xlwt 命令。
现在,目录 ~/bld/python2.7.8_ind/lib/python2.7/site-packages 中包含了一个新的包(xlwt)。
现在当我输入
~/bld/python2.7.8_dep/bin/python
>>> import xlwt

它可以工作,输入 pythonimport xlwt 会产生一个错误(如预期)。还要验证新的 Python 安装所搜索的包路径是否正确。

~/bld/python2.7.8_dep/bin/python
>>> import site
>>> site.getsitepackages()

整个过程对于非新手来说可能是显而易见的,但我是一个新手,所以我把它全部写了出来。

将其安装到 /usr/local
./configure --prefix=/usr/local

1/usr/local/lib/python2.7/ 包含了被 PIP 修改过的 dist-packages,其中使用了 Python 2.7.3,并且 site-packages 可能包含其他模块,用于与 2.7.3 版本一起使用。我该如何确保 Python 2.7.8 拥有自己的模块呢?换句话说,如果我能让第二个 PIP 安装与 /usr/local/lib/python2.7.8 配合工作,那将是理想的。 - jpf
@jpf 试过设置PYTHONPATH了吗? - muru
@muru 我还没有设置PYTHONPATH,但根据文档,标准Python库的默认搜索路径始终会附加到PYTHONPATH上;也就是说,PYTHONPATH会增强默认搜索路径,而不是完全隔离这两个安装。PYTHONHOME可能更相关于我想要做的事情,但在使用PYTHONHOME之前,我需要知道如何将任意数量的额外python2.7默认库安装到与/usr/local/lib/python2.7(通过PIP)和/usr/lib/python2.7(参见https://docs.python.org/2/using/cmdline.html)不同的目录中。 - jpf