Linux 中 Python 环境/版别办理

阿菇觉得 Python 的环境/版别办理实在是依托,感觉不如 Node.js。 尤其是在 Linux 环境下,多数发行版的体系组件、东西依靠自带的 Python,折腾体系自带的 Python 环境时,一个搞不好就会把整个体系干掉。

一起,研究安全的小伙伴经常用各种东西,而许多东西又是是基于 python2 的,而当时运用的绝大多数 Linux 发行版都自带的 python3,不便利。

另一方面,咱们的各种 python 项目都会有各自需求的依靠,而咱们总不可能把一切需求的依靠库都直接大局装置,这很丑陋,并且许多情况下不便利项目的搬迁。

流行的 python 项目/东西根本都是供给了 requirements.txt,用户需求手动本地装置。

Windows 体系中,咱们能够直接运用强壮的 Anaconda 办理咱们的 python 环境以及版别,Linux 就不可了。 这篇文章,总结了阿菇在 python 环境/版别办理方面的经验,可供参考。

前排提示!
本篇文章运用环境:体系 Ubuntu22.04,自带 python3.10.12

请根据自己的 Linux 环境行事。 :::

py3环境办理 – venv

python3 推出了 venv 模块,python3.6 及以上现已默许装置,python3.5 需求手动装置:

sudo apt install python3-venv

venv 模块支撑创立轻量级的虚拟环境,每个环境拥有它们自己装置在其 /site 目录下的 python 软件包(依靠)调集。

运用

运用以下指令能够创立一个 python 虚拟环境,python 版别与当时体系运用的 python 版别相同:

python3 -m venv env

实际效果便是在你的当时目录下创立一个名为 env 的目录,其中包含了特定的 python 解说器、软件库和二进制文件。你能够把上面指令中的 env 替换为你想要的虚拟环境称号(也便是那个目录称号),习惯上咱们会将其命名为 venv 或许 .venv,一般放在项目根目录下。

需求恪守一些默许规范。python 虚拟环境是可丢掉的,也便是说,咱们不会将其一起打包的项目中,咱们只需求给用户供给 requirements.txt 文件,用户自己创立一个虚拟环境并装置所需依靠。开发者不应该把任何项目代码放到虚拟环境目录中。一起,咱们也不会移动虚拟环境,哪里需求就在哪里创立。

创立好虚拟环境后,它只是一个放在那儿的目录,需求手动激活。

假定你是在当时目录下创立了名为 venv 的虚拟环境,你运用以下指令将这个虚拟环境激活:

source ./venv/bin/active

然后你能够发现命令行中标志出当时命令行运用了虚拟环境,虚拟环境称号默许与当时项目称号相同。

一文搞定 Linux 中 Python 环境/版别办理

图中是 zsh,装备了 oh-my-zsh,应用了 powerlevel10K 主题,通过 tabby 模拟终端东西 运用,是一个十分 nice 的组合,能够试试看!

此刻运用 pip --version 会提示用户运用的是虚拟环境中的 pip 包办理东西。激活虚拟环境后咱们就能够在这儿边肆意装置咱们需求的各种依靠了,虚拟环境与外界是阻隔的,你能够想象成虚拟机,一般不会影响到体系本身。

运用完虚拟环境后,履行以下指令封闭虚拟环境:

deactivate

进一步

便是如此的洁净清爽,咱们只需用体系自带的 python 创立虚拟环境即可,之后的一切依靠都放在各自的虚拟环境中,不必把自己体系的 python 软件包搞得一团糟。

阿菇的主张是:不要在自己的体系中装置任何额定的 python 软件包,把自带的 python 当作一个虚拟环境创立器,一切需求依靠的项目都单独创立一个虚拟环境

现在问题来了。咱们运用这个指令只能创立与当时版别相同的 python 虚拟环境,并不能满意咱们的需求,下一步该怎么做呢?

Linux中运用python2

许多 Linux 发行版不带 python2 环境,但咱们有时需求用。能够在体系中装备一个 python2 环境。

python2

包办理东西直接装置:

sudo apt install python2

装置好之后指定运用 python2 即可,默许路径是 /usr/bin/python2,此刻能够运用 python2 来运转代码了。

这儿默许装置 python2.7

pip2

为了便利地办理 python2 依靠,咱们还需求 pip2。

但通过 ubuntu 软件源装置的 python2 不自带 pip2 办理东西。这是由于 Python 2.7 的支撑周期已于 2020 年 1 月 1 日完毕,pip 21.0 也于 2021 年 1 月停止对 Python 2.7 的支撑。

只能手动装置。

假定你现已依照上文描述装置好了 python2,运用以下命令拉取 pypa.io 的装置脚本并用 python2 履行即可:

wget -O - https://bootstrap.pypa.io/pip/2.7/get-pip.py | python2

装置成功后重启终端,然后运用 pip2 --version 检查是否装置成功。现在,你现已在本地有了 python2.7 环境和对应的 pip2 包办理东西。

py2环境办理 – virtualenv

只要本地 python2 环境必定不可,咱们不能容忍咱们的软件包变成依托。

办理 python2.7 环境,咱们能够运用 venv 的前身 —— virtualenv

运用

与 venv 根本共同,这儿不再赘述:

# 装置
pip2 install virtualenv
# 创立虚拟环境 env
virtualenv env
# 激活虚拟环境
source ./env/bin/avtivate
# 封闭虚拟环境
deactivate

激活虚拟环境后,运用 python --version 检查虚拟环境的 python 版别,会提示:Python 2.7.18。这与你装置的 python2 版别有关,自行判别。

为什么不必 venv

测验 pip2 install venv 会提示:ERROR: Could not find a version that satisfies the requirement venv (from versions: none),也便是官方没有供给对应的模块版别。

或许你在什么地方看到过运用 venv 指定 python 解说器来创立对应虚拟环境,比方:

python3 -m venv --python=/usr/bin/python2 venv

不知道是否真的可行,至少阿菇这儿行不通,会提示没有存在不支撑的参数 --python,不知道是不是 venv 版别问题。

再进一步

现在有了 python2.7 和 python3.10,也做到了虚拟环境,现已能胜任多数运用场景了。

但阿菇并不满意,版别办理不够精密。咱们该怎么运用其他更细分的版别呢,比方 python3.8?

py版别办理东西 – pyenv

有一款合适的 Python 版别办理东西—— pyenv

运用

运用 Git 直接拉取 pyenv 到本地就行:

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

然后需求修改环境变量,这个和的命令行有关,这儿供给 zsh 和 bash 两个版别的:

# zsh
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
# bash
echo -e 'if shopt -q login_shell; then' 
      'n  export PYENV_ROOT="$HOME/.pyenv"' 
      'n  export PATH="$PYENV_ROOT/bin:$PATH"' 
      'n eval "$(pyenv init --path)"' 
      'nfi' >> ~/.bashrc
echo -e 'if [ -z "$BASH_VERSION" ]; then'
      'n  export PYENV_ROOT="$HOME/.pyenv"'
      'n  export PATH="$PYENV_ROOT/bin:$PATH"'
      'n  eval "$(pyenv init --path)"'
      'nfi' >>~/.profile
echo 'if command -v pyenv >/dev/null; then eval "$(pyenv init -)"; fi' >> ~/.bashrc

履行完成后就能够运用 pyenv 了。

上面的指令中中现已包含从头加载命令行装备的指令。

履行 pyenv -h 能够检查手册,然后上手用就行。

# 检查当时 python 版别
pyenv version
# 检查一切 python 版别
pyenv versions
# 检查一切可装置的 python 版别
pyenv install --list
# 装置指定 python 版别
pyenv install 3.8.12
# 装置新版别后 rehash
pyenv rehash
# 指定大局 python 版别
pyenv global 3.8.12
# 删去指定 python 版别
pyenv uninstall 3.8.12
# 指定多个大局版别, python3版别优先
pyenv global 3.8.12 2.7.10

加速pyenv

国内访问外网不便利,履行 pyenv install 时可能会十分慢,甚至超时停止访问。咱们有几种计划处理这个问题。

01 手动下载压缩包

网上最多的是手动下载压缩包到 pyenv 缓存,然后再用 pyenv install 装置。

国内有 python 镜像站,咱们进去找到对应版别压缩包下载就行:国内镜像站

一文搞定 Linux 中 Python 环境/版别办理

先找到所需版别的下载链接,右键仿制链接地址,然后运用 wget 拉取到本地 pyenv 缓存中,再履行命令下载:

wget https://registry.npmmirror.com/-/binary/python/2.7.10/Python-2.7.10.tar.xz -P ~/.pyenv/cache
pyenv install 2.7.10

02 终端署理

这个同样适用于其他下载慢的情况,设置 shell 的 http_proxy 环境变量,让终端走署理。

前提是你要有一个署理服务器,或许有相应的东西。

export https_proxy=http://127.0.0.1:7890

03 pyenv镜像

运用国内镜像站中的压缩包资源,这儿以搜狐 pyenv 镜像源为例:

v=3.5.2|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v

py环境办理东西 – pyenv-virtualenv

pyenv 能够完成便利的 python 版别办理,咱们能够运用它的 virtualenv 插件一起完成虚拟环境办理。

运用

拉取脚本然后增加环境变量,再重启 shell 即可,这儿以 zsh 为例:

# 装置插件
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
# 增加环境变量到 zsh
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
# 重启 zsh
exec zsh

然后咱们就能够运用 pyenv 的 virtualenv 插件办理虚拟环境了。只要是你现已通过 pyenv 装置的版别,都能够运用该插件创立对应的虚拟环境。

pyenv virtualenv 3.8.12 v3812env

但是要注意,virtualenv 插件的逻辑和 venv 以及 py2 的 virtualenv 模块不同,它不是在当时目录下创立虚拟环境目录,而是在 ~/.pyenv 目录中装置。

一文搞定 Linux 中 Python 环境/版别办理

运用 virtualenv 插件的虚拟环境也很便利:

# 列出当时虚拟环境
pyenv virtualenvs
# 激活虚拟环境
pyenv activate v3812env
# 退出虚拟环境
pyenv deactivate v3812env 

至此,咱们根本完成了 Linux 下便利的办理各版别的 python 虚拟环境,这答应咱们为每个项目/东西创立独立的虚拟环境,有效的保护了体系本身的整洁。

或许,还能够……?

以上是咱们的 python 版别/环境办理计划,现已够用了,但或许你并不满意。身为合格的程序员,你对环境办理有着更高的需求。

那还有更优秀的处理计划吗?

有!

Nox 堂堂登场!

一文搞定 Linux 中 Python 环境/版别办理

Nox 是一个命令行东西,用于在多个 Python 环境中进行自动测试,开发者能够运用规范的 Python 文件对项目进行装备。

咱们能够在项目根目录下创立一个 noxfile.py 文件,运用装置好的 nox 模块运转这个文件,以创立 python 虚拟环境并运转一些预订的指令。咱们也能够手动激活 python 虚拟环境,就像前面的 venv 相同。

运用事例

新建个 app 目录,在里边装备一份 noxfile.py

import nox # 引证 nox 模块
@nox.session(python='3.8.12') # 运用 python3.8.12
def install_flask(session): # 创立一个名为 install_flask 的会话
    session.install('flask') # 装置 flask 依靠

然后,咱们在当时目录下履行以下指令,初始化这个虚拟环境:

$ python3 -m nox
nox > Running session install_flask
nox > Creating virtual environment (virtualenv) using python3.8 in .nox/install_flask
nox > python -m pip install flask
nox > Session install_flask was successful.

初始化完成后,当时目录下多出 __pycache__.nox 文件,前者是缓存目录,存储编译后的 python 代码,后者便是咱们的虚拟环境目录,相似与运用 `python -m venv env“ 创立的 env 目录。

有了虚拟环境之后,常用的指令就和 venv 没有太大差别了:

# 激活 install_flask 虚拟环境
source .nox/install_flask/bin/activate
# 退出虚拟环境
deactivate

你能够把下面这段 app.py 写入当时目录下,作用是完成一个 flask Web 服务,你能够激活刚创立好的这个虚拟环境,然后测验运转这个服务。

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello, World!'
if __name__ == '__main__':
    app.run()

假如运转结果与下图相似,即 flask web 服务正常运转,则代表你的 nox 与刚创立的虚拟环境没有问题。

一文搞定 Linux 中 Python 环境/版别办理

nox 只能创立当时体系已有 python 解说器对应版别的虚拟环境,也便是说你本地没有 python2.7.10 环境,你也无法创立 2.7.10 虚拟环境。

More

能够从以下渠道继续学习 nox,它的功用远比我这个事例中所演示的强壮得多。

另一选择 – Tox

NoxTox 十分相似,二者都是 python 使命自动化东西,都能够创立虚拟环境以隔绝项目与本地体系。

终极处理计划(x)

在群里问 python 环境办理的时分,学长供给了一个终极处理计划:

“遇到 py2 的代码,就先帮他 migrate 到 py3 再跑。”

听到这句话的阿菇:

一文搞定 Linux 中 Python 环境/版别办理