这是我对这个问题的看法。适用于 Python3。主要特点是:
- 每个 Python 版本都是从源代码编译的
- 所有版本都在本地安装
- 不会以任何方式破坏系统的默认 Python 安装
- 每个 Python 版本都使用 virtualenv 隔离
先决条件:如果您正在使用一些没有安装额外草皮的准系统瘦客户端,您应该首先运行它(至少在 ubuntu 18.04 中,为方便起见添加了额外的软件包):
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository universe
sudo apt-get update
sudo apt-get install -y build-essential cmake
sudo apt-get install -y zlib1g zlib1g-dev libsqlite3-dev \
openssl libssl-dev libffi-dev unzip pciutils net-tools \
libblas-dev gfortran libblas3
步骤如下:
-
如果您以其他方式安装了多个额外的 python 版本,请将它们删除,例如,删除 $HOME/.local/lib/python3.x 等(也是全局安装的那些)。不过不要碰你系统的默认 python3 版本。
-
不同python版本的下载源码如下目录结构:
$HOME/
python_versions/ : download Python-*.tgz packages here and "tar xvf" them. You'll get directories like this:
Python-3.4.8/
Python-3.6.5/
Python-3.x.y/
...
-
在每个“Python-3.x.y/”目录中,执行以下操作(请不要在任何步骤中使用“sudo”!):
mkdir root
./configure --prefix=$PWD/root
make -j 2
make install
virtualenv --no-site-packages -p root/bin/python3.x env
-
在“python_versions/”创建这样的文件:
env_python3x.bash:
#!/bin/bash
echo "type deactivate to exit"
source $HOME/python_versions/Python-3.x.y/env/bin/activate
-
现在,只要您想选择 python3.x,就去做
source $HOME/python_versions/env_python3x.bash
进入虚拟环境
-
在 virtualenv 中,安装你最喜欢的 python 包
pip install --upgrade package_name
-
要退出 virtualenv 和 python 版本,只需输入“deactivate”
更新
--no-site-packages 似乎已被弃用。有一个简单的解决方法:激活 virtualenv 后,只需将 HOME env 变量指向实际主目录以外的其他位置,即:
export HOME=some/where/else
一般来说,一个不错的方法是:
- 创建虚拟环境
- 激活虚拟环境
- 如果您想将现有库“回收”到您的 virtualenv,请将它们从现有安装软链接,即
ln -s $HOME/.local/lib/python3.6/site-packages/numpy $PWD/venv/lib/python3.6/site-packages/
- 做
export PYTHONPATH=, export HOME=/some/other/dir
现在您应该拥有自定义隔离的 virtualenv。
更新 2 / SUDO
不想强制 sudo 使用你的 virtualenv?
Defaults secure_path="/home/USENAME/Python-3.x.y/env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults env_keep += "VIRTUAL_ENV"
Defaults env_keep += "PYTHONPATH"
现在尝试“sudo python3 --version”,魔法应该会发生
更新 3 / DOCKER
在你的 docker 中启用 virtualenv(当然,你已经在你的 docker 镜像中构建了它):
ENV VIRTUAL_ENV=/home/USER/Python-3.x.y/env
ENV PYTHONPATH=
ENV PATH="$VIRTUAL_ENV/bin:$PATH"