Python多版本与虚拟环境工具pyenv(基于macOS)
Table of Contents
Python多版本管理有多种工具,如:pyenv、virtualenv、conda等等,其中conda安装好有4个多GB,个人认为没啥必要用它,本文使用pyenv(才6M)。
安装homebrew
Homebrew是macOS上一个用于安装“命令型软件”的工具(当然它也支持安装GUI软件,这得看该GUI软件是否提供homebrew安装方式,一般来说开源软件才会提供这种安装方式)。
如果你之前安装过,这一步就可以略过了,如果没有,那就安装一下,如果不熟悉,不知道自己是否安装过,可以运行brew
命令,如果显示“zsh: Unknown command: brew”说明没有安装过,否则会提示brew
命令的使用帮助。
打开终端,运行以下命令即可安装homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
安装完成后,终端上就可以使用brew
命令(虽然它叫Homebrew,但它的命令是brew
),可以用以下命令验证
brew -h
如果正常的话它会输出一堆“Example usage:”,否则会报错“zsh: Unknown command: brew”。
安装pyenv
pyenv是一个开源的python版本管理工具,我们使用brew
来安装它
brew install pyenv
安装好之后,运行pyenv
命令,如果正常,它会显示当前python版本及该命令的使用帮助。
修改根目录:
多版本管理,肯定涉及到下载多个不同版本的python,那我们怎么知道它下载到哪儿呢?我们可以用pyenv root
命令查看,默认它是下载到~/.pyenv/
文件夹中的。
如果你想修改保存的位置,可以使用PYENV_ROOT
环境变量来指定,如下所示把以下两句添加到~/.zshrc
文件下(我建议默认就行,不要修改)
export PYENV_ROOT=$HOME/.pyenv
添加初始化命令:
添加初始化命令到~/.zshrc
中(激活虚拟环境就是靠这初始化起作用的)
eval "$(pyenv init -)"
如果是fish shell,则添加到~/.config/fish/config.fish
中
pyenv init - | source
加载修改修改后的配置:
运行以下命令以加载前面添加的配置
# zsh shell
source ~/.zshrc
# fish shell
source ~/.config/fish/config.fish
安装pyenv-virtualenv插件
pyenv-virtualenv是pyenv的一个插件,用于创建虚拟环境。
安装pyenv-virtualenv
brew install pyenv-virtualenv
使用pyenv安装python
首先使用以下命令查看可安装的版本
pyenv install --list
# --list可简写为-l
pyenv install -l
# 过滤出所有3.8的版本(因为它还有子版本,如3.8.1,3.8.2等等)
pyenv install --list | grep 3.8
使用pyenv
命令安装一个版本为“3.8”的python(安装可能需要一定时间,而且没有进度提示),建议先不要安装,往下看
pyenv install 3.8
注:未指定子版本,它会安装最高子版本,由于3.8版本最高子版本是16,所以它实际上会安装3.8.16。
解决python安装慢的问题
如果安装慢,可以自己下载压缩包并放到cache目录中,再执行安装命令,这样它会直接使用cache而不会去下载。
首先我们在pyenv的根目录创建一个cache文件夹
mkdir -p $(pyenv root)/cache/
然后我们先执行一下安装命令,比如pyenv install 3.8
,它会显示下载链接(如下所示)
python-build: use [email protected] from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.3.tar.xz...
-> https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz
我们直接通过浏览器打开该链接来下载该文件(一般按住command键点击即可直接在浏览器中打开),下载好之后,后动放到$(pyenv root)/cache/
文件夹中,然后再次执行pyenv install 3.8
命令,它就会自动使用cache文件夹中的安装包。
如果你是直接安装,它也是会先下载安装包到cache文件夹中的,所以安装完之后,cache文件夹中的包就可以删掉了(当然如果硬盘够用也可以不删,因为下次可能又要用这个版本的话,免得要再去下载)。
python是直接被安装到以下文件夹中的,如果要卸载,直接到以下文件夹中找到对应的版本文件夹删除即可
$(pyenv root)/versions/
使用pyenv创建虚拟环境
pyenv实际上是使用我们前面安装过的pyenv-virtualenv插件来创建python虚拟环境的。
创建python虚拟环境要指定python版本,并且你指定的版本必须先用pyenv install xxx
安装好(这个前面已经说过怎么安装)。
创建名为“jarvis”的基于python3.8的虚拟环境
pyenv virtualenv 3.8 jarvis
虚拟环境是被创建到对应版本的python文件夹下的envs/虚拟环境名/
文件夹中的,比如pyenv install 3.8
最终安装的是3.8.16,那么这个python最终是被安装到以下文件夹中的
$(pyenv root)/versions/3.8.16/
注:$(pyenv root)
就是指pyenv的根目录,如果你没有修改过,它默认是~/.pyenv/
,~
是指当前用户的家目录,对于macOS来说就是/Users/你的用户名/
。
如下所示,我们可以看到有个“envs”文件夹,虚拟环境文件夹就会被创建到“envs”文件夹下
> ls -l $(pyenv root)/versions/3.8.16/
total 0
drwxr-xr-x 20 bruce staff 640 Apr 8 20:19 bin/
drwxr-xr-x 3 bruce staff 96 Apr 8 20:32 envs/
drwxr-xr-x 3 bruce staff 96 Apr 8 20:18 include/
drwxr-xr-x 5 bruce staff 160 Apr 8 20:18 lib/
drwxr-xr-x 3 bruce staff 96 Apr 8 20:18 share/
“envs”文件夹内容如下所示,可以看到只有一个“jarvis”文件夹,这就是我们刚刚创建的虚拟环境
> ls -l $(pyenv root)/versions/3.8.16/envs/
total 0
drwxr-xr-x 6 bruce staff 192 Apr 8 20:32 jarvis/
查看创建了哪些虚拟环境
pyenv virtualenvs
删除刚刚创建的名为“jarvis”的虚拟环境(直接删除文件夹即可)
rm -rf ~/.pyenv/versions/jarvis
使用虚拟环境
虚拟环境可创建一个也可以创建多个,当你要使用你创建的某个虚拟环境时,需要通过命令去激活它。
激活名为“jarvis”的虚拟环境
pyenv activate jarvis
启用python虚拟环境后,当前终端窗口下就处于你指定的python虚拟环境,此时python的版本就不是你电脑中之前的python版本,而是你虚拟环境指定的python版本。
我们运行which python
查看python路径,可以看到,现在的python已经是我们刚刚安装的python
/Users/bruce/.pyenv/shims/python
再用python --version
,显示的是我们创建虚拟环境的时候指定的版本:Python 3.8.16。
如果你有安装ohmyzsh,则有更明显的标志(如下图)
取消激活虚拟环境
pyenv deactivate