Appearance
Python版本管理神器之Pyenv
前言
之前一直在用 virtualenv 和 virtualenvwrapper 这两个工具管理 Python 虚拟环境,但是有个问题,就是想要创建指定版本的虚拟环境就必须先安装指定的 Python 版本,比如我想创建一个基于 Python3.6 的虚拟环境,那么我首先得安装 Python3.6(不管是直接安装还是源码安装,总之比较麻烦),然后在基于安装好的版本去创建虚拟环境,自从知道了 pyenv 这个神器之后,就几乎不用上述工具了。 ~ pyenv 好像对 Windows 平台不太友好。
介绍
Ubuntu安装
下载
- 方式一(速度慢):
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
- 方式二(速度快):
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
执行上述操作之后,会将 pyenv 安装到当前用户的 ~/.pyenv 目录下
编辑 .bashrc 文件
- 打开 .bascrc 文件
vim ~/.bashrc
- 将一下内容复制到末尾
export PYENV_ROOT=/root/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
export PATH=$PYENV_ROOT/shims:$PATH
eval "$(pyenv init -)"
- 更新 .bashrc 文件
source ~/.bashrc
安装 Python 依赖
sudo apt-get install make build-essential libssl-dev zlib1g-dev
sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev wget curl
sudo apt-get install llvm libncurses5-dev libncursesw5-dev
sudo apt-get update
测试使用
- 查看是否安装成功
查看当前安装版本
IN:
pyenv --version
OUT:
pyenv 1.2.27-34-gbba1289e
- 查看当前所有 Python 版本
IN:
pyenv versions
OUT:
* system (set by /root/.pyenv/version)
表示当前只有系统默认的版本
- 安装 Python 指定版本
3.1 查看当前所有可安装版本
pyenv install --list
3.2 安装想要安装的版本(这里选择 Python3.6.5)
IN:
pyenv install 3.6.5
OUT:
Downloading Python-3.6.5.tar.xz...
-> https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
Installing Python-3.6.5...
Installed Python-3.6.5 to /root/.pyenv/versions/3.6.5
3.3 再次查看所有 Python 版本
IN:
pyenv versions
OUT:
* system (set by /root/.pyenv/version)
3.6.5
3.4 切换 Python 版本
有三种切换方式 glocal local shell*
glocal 全局环境,在未再次使用 glocal切换环境之前,一直使用此环境。
local 本次登录环境,重启后,则环境失效,并返回当前glocal的环境。
shell 局部(临时)环境。关闭命令行窗口,则环境失效,并返回当前glocal的环境。
pyenv glocal 3.6.5
- 卸载指定版本
pyenv uninstall 3.6.5
安装 virtualenv
- 下载
pyenv 已经帮我们以 plugin 的形式安装好了,如果未安装,则需要我们手动安装一下
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
- 编辑 .bashrc 文件
2.1 打开 .bashrc 文件
vim ~/.bashrc
2.2 将以下内容复制到末尾
eval "$(pyenv virtualenv-init -)"
2.3 更新 .bashrc 文件
source ~/.bashrc
- 创建虚拟环境
使用说明:pyenv virtualenv 3.6.5 [virtual_name](自定义虚拟环境名)
实际使用:pyenv virtualenv 3.6.5 test
- 进入虚拟环境
pyenv activate test
- 退出虚拟环境
pyenv deactivate
- 删除虚拟环境
pyenv uninstall test
输入yes即可
常用命令
使用方式: pyenv <命令> [<参数>]
命令:
commands 查看所有命令
local 设置或显示本地的 Python 版本(当前目录及其子目录)
global 设置或显示全局 Python 版本
shell 设置或显示 shell 指定的 Python 版本(本次会话)
install 安装指定 Python 版本
uninstall 卸载指定 Python 版本)
version 显示当前的 Python 版本及其本地路径
versions 查看所有已经安装的版本
which 显示安装路径
问题
1.切换不成功
如果遇到切换之后,Python版本还是系统的默认版本的话,就需要配置一下环境变量,在 ~/.zshrc 或 ~/.bash_profile 文件最后写入:
if which pyenv > /dev/null;
then eval "$(pyenv init -)";
fi
2.Python3.10 安装失败
由于 Python 3.10 之后版本不在支持 libressl 使用 ssl,需要使用 OpenSSL 安装来解决编译安装
Python 时候遇到的 ssl 模块导入失败的问题,这里需要用的 OpenSSL 1.1.1 版本或者更高版本
python
ModuleNotFoundError: No module named '_ssl'
解决办法升级 OpenSSL 版本
查看当前 openssl 版本
openssl version
OpenSSL 1.0.2g 1 Mar 2016
下载指定版本的代码
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -zxf openssl-1.1.0k.tar.gz
编译安装
cd openssl-1.1.1k
./config
make install
替换新版本的 openssl
rm /usr/bin/openssl
ln -s /usr/local/bin/openssl /usr/bin/openssl
替换后查看版本会出现以下错误
openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
将动态链接库文件复制到 /lib/x86_64-linux-gnu
cd /usr/local/lib
cp libssl.so.1.1 /lib/x86_64-linux-gnu/
cp libcrypto.so.1.1 /lib/x86_64-linux-gnu/
检查版本
openssl version
OpenSSL 1.1.1k
执行此命令安装 Python3.10
CPPFLAGS="-I/usr/include/openssl11" LDFLAGS="-L/usr/lib64/openssl11 -lssl -lcrypto" pyenv install -v 3.10.0
如果还会提示一些缺少包的错误,尝试以下命令(缺啥补啥)
$ sudo apt install ncurses-dev
$ sudo apt install libffi-dev
$ sudo apt install libreadline-dev
$ sudo apt install sqlite3 libsqlite3-dev
$ sudo apt install tk-dev
# I tried installing bzip2, but that seems to be ignored when pyenv compiles
# python. I found somewhere that I must then install libbz2-dev instead:
$ sudo apt install bzip2
$ sudo apt install libbz2-dev
# Same problem for lzma. I found that I must install liblzma-dev instead:
$ sudo apt install lzma
$ sudo apt install liblzma-dev