使用pyenv管理多版本python

使用pyenv管理多版本python

在开发 Python 程序的时候,有时候可能需要在不同版本的 Python 上进行测试。pyenv 就是这么一个管理多版本 Python 的工具。pyenv 是利用系统环境变量 PATH 的优先级,劫持 python 的命令到 pyenv 上,根据用户所在的环境或目录,使用不同版本python

Mac下安装

安装

Mac OSX 下可直接使用 brew 安装

shell
1
2
brew update
brew install pyenv

设置环境变量

如果使用的是 bash,将以下环境变量添加到 ~/.bash_profile,如果使用的是 zsh,则添加到 ~/.zshrc

shell
1
2
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc

启动终端时,自动初始化 pyenv

shell
1
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

重载配置文件

shell
1
source ~/.zshrc

查看pyenv版本

shell
1
2
# pyenv -v
pyenv 1.2.14

CentOS 下安装

安装

由于 pyenv 是通过下载 python 源码包编译安装,为了保证在编译时不出错,建议安装前安装相关依赖环境

当前环境:CentOS Linux release 7.7.1908 (Core) Minimal

shell
1
2
yum install -y gcc tk-devel @development zlib-devel bzip2 bzip2-devel \
readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel findutils

Github地址:

一般在使用 python 的时候会涉及到多个版本、不同版本的 python 创建的虚拟环境,手动安装 pyenv 后同样需要手动安装 pyenv-virtualenv 才能管理多个不同的虚拟环境。为了安装方便,我们选用官方提供的一键式安装脚本来直接安装 pyenvpyenv-virtualenv

shell
1
curl https://pyenv.run | bash

设置环境变量

然后添加环境变量到你当前使用的 shell

  • bash: vim ~/.bashrc
  • zsh: vim ~/.zshrc
~/.bashrc
1
2
3
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

重载配置文件

shell
1
source ~/.bashrc

查看pyenv版本

shell
1
2
# pyenv -v
pyenv 1.2.14

使用

pyenv 常用命令

注:使用 localglobalshell,设置 Python 版本时需要跟上参数(版本号),查看则不需要。

1
2
3
4
5
6
7
8
9
10
11
12
使用方式: pyenv <命令> [<参数>]

命令:
commands 查看所有命令
local 设置或显示本地的Python版本
global 设置或显示全局Python版本
shell 设置或显示shell指定的Python版本
install 安装指定Python版本
uninstall 卸载指定Python版本)
version 显示当前的Python版本及其本地路径
versions 查看所有已经安装的版本
which 显示安装路径

pyenv

  • 查看系统当前安装的 Python 列表

    shell
    1
    pyenv versions
  • 列出可安装版本

    shell
    1
    pyenv install --list
  • 安装指定版本 Python,如果需要用到 pyinstaller,安装 Python 时请参考 pyinstaller

    shell
    1
    pyenv install <版本号>
  • 卸载指定版本 Python

    shell
    1
    pyenv uninstall <版本号>
  • 显示当前 Python 安装路径

    shell
    1
    pyenv which python
  • 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式

    shell
    1
    pyenv global <版本号>
  • 设置面向程序的本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。

    shell
    1
    pyenv local <版本号>
  • 设置面向 shellPython 版本,通过设置当前 shellPYENV_VERSION 环境变量的方式。这个版本的优先级比 localglobal 都要高。

    shell
    1
    pyenv shell <版本号>

    --unset 参数可以用于取消当前 shell 设定的版本。

    shell
    1
    pyenv shell --unset

pyenv-virtualenv

  • 查看所有虚拟环境

    shell
    1
    pyenv virtualenvs
  • 创建指定python版本的虚拟环境

    shell
    1
    pyenv virtualenv <python版本> <虚拟环境名>
  • 使用虚拟环境生效

    shell
    1
    pyenv activate <虚拟环境名>
  • 退出虚拟环境

    shell
    1
    pyenv deactivate
  • 删除虚拟环境,简单粗暴地将整个目录干掉即可

    shell
    1
    pyenv uninstall <虚拟环境名>

修改pip源

在使用 Python 时如果网络状态不佳直接从官方 PyPI 仓库拉取代码速度较慢,推荐使用阿里云 PyPI 镜像仓库

shell
1
mkdir ~/.pip && vim ~/.pip/pip.conf

添加如下内容

~/.pip/pip.conf
1
2
3
4
5
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

安装包获取加速

Pyenv 中默认获取 Python 安装包是去 https://www.python.org/ftp/python 中拉取,由于国内特殊的网络环境,可能会拉取失败。我们可以使用以下两种方式加速安装 Python 速度。

替换 Pyenv 中源

使用如下命令替换 Pyenv 脚本中所有 https://www.python.org/ftp/python华为云镜像仓库

shell
1
2
sed -i "s?https://www.python.org/ftp/python?https://mirrors.huaweicloud.com/python?g" \
$(grep -rl "https://www.python.org/ftp/python" ~/.pyenv/)

然后我们可以再次使用 pyenv install 命令时就会直接去对应的镜像库而不是国外拉取了

1
2
3
4
5
# pyenv install 3.8.6
Downloading Python-3.8.6.tar.xz...
-> https://mirrors.huaweicloud.com/python/3.8.6/Python-3.8.6.tar.xz
Installing Python-3.8.6...
Installed Python-3.8.6 to /root/.pyenv/versions/3.8.6

手动下载安装包

使用 wget 等工具提前下载好 Python 源码包到 Pyenv 的 cache 目录下,然后安装离线包

shell
1
wget https://mirrors.huaweicloud.com/python/3.8.7/Python-3.8.7.tar.xz -P ~/.pyenv/cache

使用离线包安装 Python

shell
1
2
3
# pyenv install 3.8.7
Installing Python-3.8.7...
Installed Python-3.8.7 to /root/.pyenv/versions/3.8.7

常见问题

在尝试安装新的 Python 版本之前,请先安装 Python 构建依赖项wiki

如果您在安装 Python 版本时遇到问题,请访问有关常见构建问题的Wiki页面

安装 Pyenv 超时

使用自动化脚本安装 Pyenv 时如出现如下情况

1
2
3
4
5
# curl https://pyenv.run | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 285 100 285 0 0 73 0 0:00:03 0:00:03 --:--:-- 73
curl: (7) Failed connect to raw.githubusercontent.com:443; 拒绝连接

可能是由于 DNS 污染造成的,比如说我这儿就是,被上游 DNS 解析到了 127.0.0.1 ╮(╯▽╰)╭

1
2
3
4
ping raw.githubusercontent.com
PING raw.githubusercontent.com (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.053 ms

我们可以通过 https://www.ipaddress.com/ 这个网络去查询域名正确的 IP,然后在 hosts 文件中手动映射

/etc/hosts
1
2
199.232.96.133 raw.githubusercontent.com
140.82.112.3 github.com

配置好后再次执行 curl https://pyenv.run | bash 就可以正常安装 Pyenv 了

pyinstaller

直接使用 pyenv install 3.7.5 安装后使用 pyinstaller 打包会报如下错误

1
2
3
4
5
6
7
8
OSError: Python library not found: libpython3.7m.so.1.0, libpython3.7.so.1.0, libpython3.7mu.so.1.0
This would mean your Python installation doesn't come with proper library files.
This usually happens by missing development package, or unsuitable build parameters of Python installation.

* On Debian/Ubuntu, you would need to install Python development packages
* apt-get install python3-dev
* apt-get install python-dev
* If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)

需要使用如下方法重新安装 python:

  • Mac OSX

    shell
    1
    env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.7.5
  • CentOS
    shell
    1
    env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.5

pip install报错

使用 pip install 时报错如下:ModuleNotFoundError: No module named '_ctypes'

需要安装相关依赖包 libffi-devel,后再次重新编译安装 Python

shell
1
yum -y install libffi-devel
评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...