返回

Ubuntu 不同 Python 版本 apt-get 安装软件包指南

Linux

Ubuntu 上为不同 Python 版本使用 apt-get install 安装软件包

有时候, 你会在一个 Ubuntu 系统上安装多个 Python 版本。比如, 系统默认自带 Python 2.6, 但你又装了 Python 2.7。 这时候用 apt-get install python-<package> 安装软件包, 它会默认装到 Python 2.6 下。 这篇文档讲讲, 怎么让软件包安装到 Python 2.7。

问题产生原因

根本原因在于 Ubuntu 的 apt-get 系统, 以及它与不同 Python 版本的集成方式。

  1. 系统默认 Python 版本: apt-get 在安装 "python-" 开头的软件包时,会优先考虑系统的默认 Python 版本。Ubuntu 10.04, Python 2.6 是默认的。apt-get 不会自动去探测其他已安装的 Python 版本。

  2. 软件包命名: Ubuntu 软件包仓库里的 Python 软件包通常是为特定 Python 版本构建的. 像 python-torctl 这样的名字, 通常是指针对系统默认 Python (也就是 Python 2.6) 的软件包. 没有直接的 python2.7-torctl 这样的包。

  3. Alternatives机制不一定能完全解决 : 尽管 Linux 有 update-alternatives 机制, 它主要用于管理不同版本的命令 (比如 python 指向 python2.6 还是 python2.7),但它不能直接解决 apt-get 安装软件包时的版本选择问题。

解决方案

要解决这个问题,得从几个不同角度入手。

方法一:使用 pip (推荐)

pip 是 Python 的包管理工具, 它能让你更好地控制安装到哪个 Python 版本。

  1. 原理: pip 独立于 apt-get。 它是直接从 Python Package Index (PyPI) 下载并安装软件包. 每一个 Python 版本都有它自己对应的 pip

  2. 操作步骤:

    • 先确保 Python 2.7 已经安装好。
    • 给 Python 2.7 安装 pip
      wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
      sudo python2.7 get-pip.py
      
    • 用 Python 2.7 的 pip 安装包:
      sudo pip2.7 install <package_name>
      
      例如,要安装 torctl:
      sudo pip2.7 install torctl
      
    • 安全建议: 不推荐使用过旧版本的Python 和 pip. Ubuntu 10.04 非常古老. 如果生产环境用老版本, 风险极高. 请尽快升级.
  3. 进阶使用

    可以使用虚拟环境, 更精细地管理不同项目的依赖:

    • 安装 virtualenv
    sudo pip2.7 install virtualenv
    
    • 为使用 Python 2.7的项目创建独立的运行环境
    virtualenv -p /usr/bin/python2.7 my_project_env
    
    • 使用如下命令激活
    source my_project_env/bin/activate
    
    • 在激活的环境里,用 pip (它会自动对应于 Python 2.7 的 pip) 安装软件包,这些包就只会安装到这个隔离的环境。

方法二:尝试从源代码编译安装

如果某个包没有提供直接适配 Python 2.7 的版本, 而且 pip 也搞不定 (很少见), 还可以考虑从源代码编译。

  1. 原理: 源代码通常是与 Python 版本无关的 (或兼容多个版本)。编译的过程,会使用你指定的 Python 版本来构建和安装。

  2. 操作步骤:

    • 下载软件包的源代码 (通常是 .tar.gz.zip 文件)。
    • 解压缩:
      tar -xzvf package_source.tar.gz
      cd package_source
      
    • 用 Python 2.7 编译并安装:
      sudo python2.7 setup.py install
      

    *安全建议: 确认你下载的源码是可信的. 不要随便从不明来源下载东西来编译。

  3. 进阶用法:

    编译的时候有些额外的参数是可以调的,来适应安装的环境,可以细读setup.py或参考项目readme文件。

方法三:修改 apt-get 的配置 (不推荐, 风险高)

警告: 强烈不推荐修改系统级别的 apt-get 配置。 很容易搞乱系统依赖, 导致其他问题! 这里只是作为一种可能的思路提出, 实践中应尽量避免。

  1. 原理: (非常粗略的) 尝试手动调整 apt-get 的某些配置文件或环境变量, 让它在处理 python- 开头的软件包时,去关联 Python 2.7。

  2. 操作步骤: (仅为示意, 不要照搬!)

    • 可能需要修改 /etc/apt/apt.conf/etc/apt/preferences, 但具体怎么改, 取决于你的系统配置, 以及你要安装的软件包. 没有通用的做法。
    • 可能还要修改 PYTHONPATH 等环境变量。
    • 非常容易出错!
  3. 风险说明: Ubuntu的软件依赖很复杂, 如果你瞎改apt,更新或者安装别的的时候很容易冲突。 如果只是为单独一个软件这样做, 付出代价太大, 系统搞崩溃很常见.

方法四: 使用debootstrap/chroot构建独立的 Python2.7 环境 (进阶)

如果上述都无法解决问题, 而你 必须apt-get 安装一个明确只支持旧版 Python 的包, 可以试试 debootstrap 结合 chroot.

  1. 原理:

    • debootstrap 可以在一个目录里, 搭建一个最小化的、特定版本的 Ubuntu 系统.
    • chroot 可以让你 "切换" 进那个目录, 就好像真的在运行那个迷你系统.
  2. 操作步骤:

    • 安装debootstrap

      sudo apt-get install debootstrap
      
    • 创建一个用于存放 Python 2.7 及其依赖的目录, 比如:

      sudo mkdir /opt/python27_env
      
    • debootstrap 构建一个Ubuntu 10.04 (因为你说原系统是 10.04, 这样做兼容性最好) 的基础系统到刚创建的目录,例如:

       sudo debootstrap --arch i386 lucid /opt/python27_env http://archive.ubuntu.com/ubuntu/
      

      (注意: --arch 参数根据你的 CPU 架构调整, 上面的是 32 位 x86 的例子。 如果是 64 位, 换成 amd64. lucid 是 Ubuntu 10.04 的代号. 最后的 URL 是 Ubuntu 的旧版本软件源.)

    • "切换" 进这个新环境:

      sudo chroot /opt/python27_env
      
    • 你会发现命令提示符变了. 现在你 "在" 那个迷你系统里. 可以像平常一样用 apt-get:

         apt-get update
         apt-get install python-yourpackage # 比如 python-torctl
        ```
     这些包会安装在 `/opt/python27_env` 下, 不会影响宿主系统.
    
    
  3. 进阶:

    要执行环境下的 python 文件,需要使用/usr/bin/python2.7 your_python_file.py.

    debootstrap 还有一些进阶参数, 比如 --variant=minbase 可以构建更小的系统. 可以参考它的文档.

  4. 注意事项

  • 这样做相对复杂, 但它能提供一个干净的隔离环境。如果你不确定怎么用 debootstrapchroot先找些资料学习一下.
  • 使用这个环境运行软件要额外小心. 特别注意文件路径等, 毕竟这是个 chroot 环境, 和宿主系统不是完全一样的.
  • 建议先在测试环境中实验此方法, 确认没有问题, 再应用到生产系统。

总的来说,对于给不同的Python版本使用apt-get 安装包, 首选pip. 其他方案有其局限性和风险. 如果只是单个软件包的需求,用 pip 或者编译安装通常更方便. 如果你一定需要 apt-get,而且有特定 Python 版本的强需求, debootstrap/chroot 可以创建一个隔离环境来做这件事,但相对复杂.