用pyenv和venv进行python版本及依赖管理

当尝试多个python项目时,python的版本管理成为一个难题:一方面,不同的项目可能支持的python版本不同;另一方面,不同项目(甚至同一个项目的不同版本)对某个依赖库的版本要求不同。如果都将依赖一股脑装到全局环境中,经常会发生冲突。

实践证明,python版本以及依赖库的版本绝非越高越好。有一些旧的库会被抛弃(甚至标准库),如果换成新的库,则需要对代码进行大量修改,进一步增加了其不兼容性。

所以最好的方案是能在系统中安装多个python版本,彼此互不干扰。pyenv就是这样一种工具。以下均以windows为例。

1、安装pyenv

pyenv的项目地址:https://github.com/pyenv-win/pyenv-win
安装它,可以使用powershell,执行以下命令:

Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"

 2、安装多个版本的python

在powershell中,首先设置代理环境(看破不说破):

$env:HTTP_PROXY = "http://127.0.0.1:7890"
$env:HTTPS_PROXY = "http://127.0.0.1:7890"

用install -l命令查看所有支持的版本列表:

pyenv install -l

然后即可安装想要的版本:

pyenv install 3.11.0
pyenv install 3.12.0
pyenv install 3.8.0

目前python已经更新到了3.13.0,但兼容它的项目还不多,比如torch就还不支持3.13.0,所以装到3.12.0已经够新了。

3、设置项目文件夹的python环境版本

首先cmd导航到项目文件夹,然后执行local命令:

pyenv local 3.11.0

这会在该目录下生成一个.python-version文件,里面写着你设定的版本号。今后在该目录下执行python命令,就会自动应用设定的版本环境。

4、结合虚拟环境为不同的项目单独安装依赖

仅仅区分版本还是不够的,在使用同一个python版本的不同项目中,依赖仍然可能冲突。最保险的方法是各装各的依赖。所以需要用到python自带的虚拟环境功能。

在项目文件夹中执行venv命令:

python -m venv myvenv

它会将你用pyenv指定的python版本的环境复制一份,放到当前文件夹的myvenv目录。

之后,务必记得需要激活虚拟环境,在命令行中执行:

.\myvenv\scripts\activate

之后提示符前面会带上(myvenv),表明当前已经处于虚拟环境。这时候使用pip install安装的所有依赖,都会保存到myvenv文件夹,这就与其他项目彻底分开了。

当要退出当前虚拟环境时,直接执行:

deactivate

5、设置全局python版本

其实每个项目都单独设置之后,全局的版本是什么已经不重要了。设置它的方式:

pyenv global 3.12.0

这样全局环境下执行python就是3.12.0版本。

查看pyenv支持的所有命令:

pyenv commands

6、批处理调用虚拟环境

由于虚拟环境在激活时,默认会重置一下命令行窗口,所以直接把.\myvenv\scripts\activate放到bat文件中是不行的。解决的方式是加一个call,并且去掉前面那个表示当前目录的点:

call myvenv\scripts\activate

如此,pyenv和venv结合,就可以完全掌控python的多版本,并隔离不同项目的依赖了。