Ubuntu 不同 Python 版本 apt-get 安装软件包指南
2025-03-06 14:45:02
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 版本的集成方式。
-
系统默认 Python 版本:
apt-get
在安装 "python-" 开头的软件包时,会优先考虑系统的默认 Python 版本。Ubuntu 10.04, Python 2.6 是默认的。apt-get
不会自动去探测其他已安装的 Python 版本。 -
软件包命名: Ubuntu 软件包仓库里的 Python 软件包通常是为特定 Python 版本构建的. 像
python-torctl
这样的名字, 通常是指针对系统默认 Python (也就是 Python 2.6) 的软件包. 没有直接的python2.7-torctl
这样的包。 -
Alternatives机制不一定能完全解决 : 尽管 Linux 有
update-alternatives
机制, 它主要用于管理不同版本的命令 (比如python
指向python2.6
还是python2.7
),但它不能直接解决apt-get
安装软件包时的版本选择问题。
解决方案
要解决这个问题,得从几个不同角度入手。
方法一:使用 pip (推荐)
pip
是 Python 的包管理工具, 它能让你更好地控制安装到哪个 Python 版本。
-
原理:
pip
独立于apt-get
。 它是直接从 Python Package Index (PyPI) 下载并安装软件包. 每一个 Python 版本都有它自己对应的pip
。 -
操作步骤:
- 先确保 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 非常古老. 如果生产环境用老版本, 风险极高. 请尽快升级.
-
进阶使用
可以使用虚拟环境, 更精细地管理不同项目的依赖:
- 安装 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
也搞不定 (很少见), 还可以考虑从源代码编译。
-
原理: 源代码通常是与 Python 版本无关的 (或兼容多个版本)。编译的过程,会使用你指定的 Python 版本来构建和安装。
-
操作步骤:
- 下载软件包的源代码 (通常是
.tar.gz
或.zip
文件)。 - 解压缩:
tar -xzvf package_source.tar.gz cd package_source
- 用 Python 2.7 编译并安装:
sudo python2.7 setup.py install
*安全建议: 确认你下载的源码是可信的. 不要随便从不明来源下载东西来编译。
- 下载软件包的源代码 (通常是
-
进阶用法:
编译的时候有些额外的参数是可以调的,来适应安装的环境,可以细读
setup.py
或参考项目readme
文件。
方法三:修改 apt-get 的配置 (不推荐, 风险高)
警告: 强烈不推荐修改系统级别的 apt-get
配置。 很容易搞乱系统依赖, 导致其他问题! 这里只是作为一种可能的思路提出, 实践中应尽量避免。
-
原理: (非常粗略的) 尝试手动调整
apt-get
的某些配置文件或环境变量, 让它在处理python-
开头的软件包时,去关联 Python 2.7。 -
操作步骤: (仅为示意, 不要照搬!)
- 可能需要修改
/etc/apt/apt.conf
或/etc/apt/preferences
, 但具体怎么改, 取决于你的系统配置, 以及你要安装的软件包. 没有通用的做法。 - 可能还要修改
PYTHONPATH
等环境变量。 - 非常容易出错!
- 可能需要修改
-
风险说明: Ubuntu的软件依赖很复杂, 如果你瞎改
apt
,更新或者安装别的的时候很容易冲突。 如果只是为单独一个软件这样做, 付出代价太大, 系统搞崩溃很常见.
方法四: 使用debootstrap/chroot构建独立的 Python2.7 环境 (进阶)
如果上述都无法解决问题, 而你 必须 用 apt-get
安装一个明确只支持旧版 Python 的包, 可以试试 debootstrap
结合 chroot
.
-
原理:
debootstrap
可以在一个目录里, 搭建一个最小化的、特定版本的 Ubuntu 系统.chroot
可以让你 "切换" 进那个目录, 就好像真的在运行那个迷你系统.
-
操作步骤:
-
安装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` 下, 不会影响宿主系统.
-
-
进阶:
要执行环境下的 python 文件,需要使用
/usr/bin/python2.7 your_python_file.py
.debootstrap
还有一些进阶参数, 比如--variant=minbase
可以构建更小的系统. 可以参考它的文档. -
注意事项
- 这样做相对复杂, 但它能提供一个干净的隔离环境。如果你不确定怎么用
debootstrap
和chroot
, 先找些资料学习一下. - 使用这个环境运行软件要额外小心. 特别注意文件路径等, 毕竟这是个 chroot 环境, 和宿主系统不是完全一样的.
- 建议先在测试环境中实验此方法, 确认没有问题, 再应用到生产系统。
总的来说,对于给不同的Python版本使用apt-get
安装包, 首选pip
. 其他方案有其局限性和风险. 如果只是单个软件包的需求,用 pip 或者编译安装通常更方便. 如果你一定需要 apt-get
,而且有特定 Python 版本的强需求, debootstrap
/chroot
可以创建一个隔离环境来做这件事,但相对复杂.