pyenv、虚拟环境 on macos和linux

Install pyenv on linux and macos

linux

Install - 使用git安装pyenv

clone pyenv repo 到 ~/.pyenv

git clone --depth git@github.com:pyenv/pyenv.git ~/.pyenv

配置

.bashrc 中增加下面的内容。这里装的是3.8.11的版本。

#vim ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init --path)"
  eval "$(pyenv init -)"
fi

export VIRTUALENVWRAPPER_PYTHON=/home/albert/.pyenv/versions/3.8.11/bin/python
export WORKON_HOME=$HOME/.virtualenvs

source /home/albert/.pyenv/versions/3.8.11/bin/virtualenvwrapper.sh

macos

Install - homebrew安装pyenv

brew install pyenv

我用的是zsh,以下按zsh配置:

# 查看当前使用的shell
$echo $SHELL
/bin/zsh

PYENV_ROOT 是pyenv的安装目录,因为是homebrew安装的,所以在 /usr/local/var/pyenv 。如果是 git clone 安装的,=PYENV_ROOT= 配置为clone的目录,如 $HOME/.pyenv

# vim ~/.zshrc
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
export PYENV_ROOT=/usr/local/var/pyenv
  1. 查看当前激活的是哪个版本的Python

    $pyenv version
    3.5.3 (set by /Users/albert/.python-version)
    
  2. 查看已经安装了哪些版本的python

    $pyenv versions
       system
     * 3.5.3 (set by /Users/albert/.python-version)
    
  3. 显示当前python安装路径

    $pyenv which python
    /usr/local/var/pyenv/versions/3.5.3/bin/python
    

配置

~/.zshrc 中增加下面的内容:

#vim ~/.zshrc
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
export PYENV_ROOT=/usr/local/var/pyenv
export PATH="$PYENV_ROOT/bin:$PATH"

export VIRTUALENVWRAPPER_PYTHON=/usr/local/var/pyenv/versions/3.5.3/bin/python
export WORKON_HOME=$HOME/.virtualenvs

# source /usr/local/var/pyenv/shims/virtualenvwrapper.sh
source /usr/local/var/pyenv/versions/3.5.3/bin/virtualenvwrapper.sh

使用pyenv

安装指定版本python

pyenv只能管理通过 pyenv install 安装的python版本和系统自带的版本。

pyenv install 3.5.3
# 安装完成后必须rehash
pyenv rehash

设置使用哪个python版本

  1. 系统全局用系统默认的Python比较好,不建议直接对其操作。

    pyenv global system
    
  2. 用local进行指定版本切换,一般开发环境使用。

    pyenv local 3.5.3
    
  3. 对当前用户的临时设定Python版本,退出后失效

    pyenv shell 3.5.3
    
  4. 取消某版本切换

    pyenv local 3.5.3 --unset
    
  5. 优先级关系:shell —> local —> global

虚拟环境

virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够:

  1. 在没有权限的情况下安装新套件
  2. 不同应用可以使用不同的套件版本
  3. 套件升级不影响其他应用

Virtaulenvwrapper 是virtualenv的扩展包,用于更方便管理虚拟环境,它可以做:

  1. 将所有虚拟环境整合在一个目录下
  2. 管理(新增,删除,复制)虚拟环境
  3. 切换虚拟环境

安装和使用方法

  1. 安装

    pip install virtualenv
    pip install virtualenvwrapper
    
  2. 创建虚拟环境

    mkvirtualenv [虚拟环境名称]
    

    此时还不能使用virtualenvwrapper,默认virtualenvwrapper安装在/usr/local/bin下面,实际上你需要运行virtualenvwrapper.sh文件才行。

  3. 创建目录用来存放虚拟环境 先在HOME目录下创建虚拟环境使用的目录。

    mkdir $HOME/.virtualenvs
    
    # 在 .zshrc 追加两行
    export WORKON_HOME=$HOME/.virtualenvs
    
    # 指定虚拟环境使用的python,否则会使用macos系统自带的python导致报错。
    export VIRTUALENVWRAPPER_PYTHON=/usr/local/var/pyenv/versions/3.5.3/bin/python
    
    # brew安装的python在 /usr/local/bin 下面没有virtualenvwrapper.sh,只能用pyenv安装的python3.5.3下的了。
    # source /usr/local/bin/virtualenvwrapper.sh
    source /usr/local/var/pyenv/versions/3.5.3/bin/virtualenvwrapper.sh
    
    运行: 
    source ~/.zshrc
    

    此时virtualenvwrapper就可以使用了。

创建虚拟环境 - mkvirtualenv

在当前的环境的Python版本下创建名称为 blog_10 的虚拟环境。

mkvirtualenv blog_10

默认情况下,虚拟环境会依赖系统环境中的site packages,就是说系统中已经安装好的第三方package也会安装在虚拟环境中,如果不想依赖这些package,那么可以加上参数 –no-site-packages建立虚拟环境

例如:

mkvirtualenv --no-site-packages [虚拟环境名称]
mkvirtualenv --no-site-packages blog_10

查看创建的虚拟环境 - lsvirtualenv

[albert@MacBookAir /Users/albert]
$lsvirtualenv 
blog_10
=======

启动某虚拟环境 - workon

# workon [虚拟环境名称]
$workon
blog_10

[albert@MacBookAir /Users/albert]
$which python
/usr/local/var/pyenv/shims/python
[albert@MacBookAir /Users/albert]
$python -V
Python 3.5.3
[albert@MacBookAir /Users/albert]
$workon blog_10 
(blog_10) [albert@MacBookAir /Users/albert]
$lsvirtualenv 
blog_10
=======

删除虚拟环境 - rmvirtualenv

rmvirtualenv [虚拟环境的名字]
$rmvirtualenv blog_10

需要说明的是,无法在虚拟环境中删除虚拟环境,要先退出虚拟环境才行。

退出虚拟环境 - deactivate

在虚拟环境中使用deactivate则退出了虚拟环境,只有就可以删除虚拟环境了。

deactivate

注意: pyenv virtualenv 命令和 mkvirtualenv 命令创建的虚拟环境是无法互相使用的,也就是说 pyenv virtualenv 命令创建的虚拟环境无法被 workon 命令识别,同样的 mkvirtualenv 命令创建的虚拟环境也无法被 pyenv versions 等命令识别。

使用流程

source ~/.zshrc
albert@MacBookAir ~ % source ~/.zshrc

# 未使用虚拟环境
[albert@MacBookAir /Users/albert]
$pyenv versions
  system
 * 3.5.3 (set by /Users/albert/.python-version)
[albert@MacBookAir /Users/albert]
$pyenv local 
3.5.3
[albert@MacBookAir /Users/albert]
$pyenv shell 
pyenv: no shell-specific version configured
[albert@MacBookAir /Users/albert]
$pyenv global 
system
[albert@MacBookAir /Users/albert]
$which python;python -V
/usr/bin/python
Python 2.7.16

# 使用 blog_10 虚拟环境
[albert@MacBookAir /Users/albert]
$workon blog_10 
(blog_10) [albert@MacBookAir /Users/albert]
$which python;python -V
/Users/albert/.virtualenvs/blog_10/bin/python
Python 3.5.3
(blog_10) [albert@MacBookAir /Users/albert]

# 退出 blog_10 虚拟环境
$deactivate 
[albert@MacBookAir /Users/albert]
$which python;python -V
/usr/bin/python
Python 2.7.16
[albert@MacBookAir /Users/albert]
$pyenv global 
system
[albert@MacBookAir /Users/albert]
$pyenv local 
3.5.3
[albert@MacBookAir /Users/albert]
$pyenv shell 
pyenv: no shell-specific version configured

emacs

M-x pyvenv-workon

关闭lsp-headerline-breadcrumb-mode

lsp-mode.el 中,从 t 改为 nil

(defcustom lsp-headerline-breadcrumb-enable nil
)

pyright配置

在项目root directory下新建 pyrightconfig.json 文件,指定虚拟环境的路径和虚拟环境的名字。这样emacs在打开项目下的文件时能自动初始化虚拟环境,不需要手工在emacs中激活对应的虚拟环境,lsp-mode可以直接使用正确的虚拟环境。

{
    "venvPath": "/Users/albert/.virtualenvs/",
    "venv": "pandas"
}

参考