pyenv: python虚拟环境工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


0x0 安装配置pyenv和virturalenv插件

0x00 pyenv

  1. 准备安装目录:$HOME/.pyenv
  2. 下载pyenv项目
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
  1. 配置环境变量
# centos
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc

# macos
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

0x01 pyenv-virtualenv插件

  1. 下载pyrnv-virtualenv项目
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
  1. 配置环境变量
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
  1. 重启shell
exec $SHELL

0x02 pyenv下载安装包速度

  1. 生成脚本工具文件夹:$HOME/tools/
  2. 创建脚本文件
#!/bin/bash                                                                                                                                                                

cache="$HOME/.pyenv/cache"
pypack="Python-$1.tar.xz"

if [ ! -d "$cache"  ]; then  # 如果不存在此目录,创建
    mkdir $cache
fi

if [ ! -f "$cache/$pypack" ]; then  # 如果不存在 Python 安装包,就用 wget 下载
    wget -P $cache https://npm.taobao.org/mirrors/python/$1/$pypack  
    # `wget -P dir url` 表示将 url 指向的内容下载到 dir 目录下
else
    printf "\033[1;33m$cache/$pypack is existed.\033[0m\n"  # 提示语
fi

pyenv install $1  # 执行安装
  1. 配置环境变量
vim $HOME/tools/pyenv-install 
# 复制上述代码,wq 保存退出
chmod 777 $HOME/tools/pyenv-install  # 修改权限
echo "export PATH=$HOME/tools:$PATH" >> ~/.bashrc  # 添加环境变量
source ~/.bashrc
pyenv install --list  # 查看可以下载的python版本
# 现在可以用 pyenv-install 命令下载安装 python 了
(root) $ pyenv-install 3.6.6

0x1 使用pyenv

  1. 创建虚拟环境
# python3.6.6必须已经通过pyenv安装上了
# 基于python 3.6.6创建了名为myenv的虚拟环境
pyenv virtualenv 3.6.6 myenv
  1. 激活虚拟环境
# 激活了所创建了虚拟环境myenv,出现命令行首出现(myenv)
pyenv activate myenv
  1. 查看环境
pyenv version   #查看当前激活的python环境
pyrnv versions  #查看所有存在的python环境
  1. 删除虚拟环境
  • 删除文件
# 直接删除
$(pyenv root)/versions和$(pyenv root)/versions/{version}/envs中指定的文件

# 例子
若要删除虚拟环境my-env,则需删除$(pyenv root)/versions下的my-env文件夹
此外,由于虚拟环境是基于python 3.6.6创建的,因此还需要到$(pyenv root)/versions/3.6.6/envs删除文件夹my-env
  • 使用uninstall删除
pyenv uninstall my-env
  • 使用virtualenv-delete删除
pyenv virtualenv-delete my-env
  1. 为项目设置虚拟环境
cd ~/test   #进入项目test的目录
pyenv local myenv   #把项目的python环境设置为所创建的myenv,
                    #test目录下生成了隐藏文件.python-version,
                    #文件中记录了当前项目所使用的python环境:myenv
                    #此隐藏文件的作用是每当进入test目录,则激活环境myenv

0x2 卸载pyenv

由于 pyenv 把一切都放在 ~/.pyenv 下了,卸载仅需执行以下两步:

# 1.首先你需要删除环境变量
# 2.然后执行以下两条命令中的任意一条都可以
rm -rf ~/.pyenv
rm -rf $(pyenv root)

0x3 pyenv配置问题

0x30 问题描述

pyenv正常安装(可以正常执行pyenv versions),pyenv的virtualenv插件正常安装(可以成功创建、激活、反激活虚拟环境)首先创建并激活虚拟环境myenv01,进入项目文件夹test后,执行pyenv local myenv01.命令行提示字符前出现(myenv01)说明激活虚拟环境成功;退出test文件夹后,此标志消失,说明pyenv local命令没有问题。重新进入test,执行python --version查看test下使用的python版本是否为myenv01所基于的版本。结果发现不是,仍然是系统的python版本。

0x31 debug

pyenv的原理:.pyenv目录下维护着各种python版本及基于它们的虚拟环境。pyenv的核心是shim,利用pyenv安装了某个版本的python,则生成一个shim。pyenv用shim截获,系统在环境变量$PATH中搜索的过程,让shims目录下的python先于系统原有的python而被找到,一旦找到,系统会停止搜索。举个例子$PATH=/home/cg/.pyenv/shims:/usr/local/bin。假设skims目录下有3.8.0版本的python,bin目录下安装着
3.6.5版本的python,那么执行python命令时,系统扫描$PATH,从左到右,先得到路径skims,发现在其中找到了所执行的python命令可执行文件,那么停止搜索,将使用skims目录下的文件。

0x32 problem

$PATH中不但有重复的路径,还使得缺乏shim目录。正确的情况应当是shim目录位于系统python的安装目录之前。这样pyenv所管理的python版本将能够被优先扫描识别出来,从而成功切换到指定版本的python。

0x33 复现

# 问题描述
$ pyenv-insatll 3.8.0
$ pyenv virtualenv 3.8.0 myenv01
$ mkdir test && cd test
$ pyenv activate myenv01
(myenv01) $ python -V
bash: python: command not found...

# 问题分析
未能在当前环境中找到python解释器,应当把pyenv用于维护各个版本python的shims文件夹加入环境中

# 处理
$ echo "export PATH=$PATH:/home/cg/.pyenv/shims" >> ~/.bashrc

0x4 补充

0x40 windows的python虚拟环境方案

0x400 pyenv-win

# 默认就安装在当前路径的.pyenv下,
pip install pyenv-win --target=xxx/.pyenv
# 设置环境变量
PYENV_HOME=xxx/.pyenv/pyenv-win/
用户path追加:%PYENV_HOME%\shims
用户path追加:%PYENV_HOME%\bin
# 列出可以安装的python版本
pyenv install --list
# 安装指定python版本
pyenv install 3.8.2
# 设置pyenv的全局版本
pyenv global 3.8.2
# 为项目文件设置局部python版本
cd xx/project
pyenv local 3.8.2  # 创建xx/project/.python-version文件
# 一定要rehash一下
pyenv rehash
# 查看已经安装好的python版本
pyenv versions

0x401 virtualenv

# linux中的virtualenv是pyenv的一个插件,win中的virtualenv相对pyenv-win独立。
pip install virtualenv

# 为项目创建虚拟环境
cd xx\project
virtualenv -p xxx\python.exe my_env  # 指定编译器创建虚拟环境,生成xx/project/my_env文件夹
.\my_env\Scripts\activate  # 激活虚拟环境
deactivate  # 反激活虚拟环境

0x41 迁移虚拟环境

尚未验证,谨慎参考

# 查看链接类型(符号链接/硬链接)
ll
# 以l开头的是软链接
# 以-开头的是硬链接

# 修改$PYENVROOT/versions下的软连接
ln -s /home/chengang03/.pyenv/versions/2.7.15/envs/pontus-dev pontus-dev
ln -s /home/chengang03/.pyenv/versions/3.7.11/envs/aether aether
ln -s /home/chengang03/.pyenv/versions/3.8.0/envs/pontus-38 pontus-38
ln -s /home/chengang03/.pyenv/versions/3.8.0/envs/torch-dev torch-dev
ln -s /home/chengang03/.pyenv/versions/3.8.0/envs/myenv01 myenv01


# 修改$PYENVROOT/versions/版本号/envs/虚拟环境名/bin下的软链接
ln -s /home/chengang03/.pyenv/versions/3.8.0/bin/python3.8 python3.8
ln -s /home/chengang03/.pyenv/versions/3.8.0/envs/torch-dev torch-dev

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值