menu E4b9a6's blog
rss_feed
E4b9a6's blog
有善始者实繁,能克终者盖寡。

使用Pyenv来管理PY版本

作者:E4b9a6, 创建:2021-06-15, 字数:1604, 已阅:101, 最后更新:2024-03-10

这篇文章更新于 226 天前,文中部分信息可能失效,请自行甄别无效内容。

pyenv是目前管理Python版本的流行方案,可以完美地解决一台PC上存在多个Python版本的问题

pyenv lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.

以下安装过程基于 Debian10,理论上Ubuntu也应该没有问题

首先安装必要的依赖软件

Bash
sudo apt update
sudo apt -y install git gcc libgdbm-dev make patch zlib1g-dev libssl-dev libsqlite3-dev libbz2-dev libreadline-dev build-essential python-dev python-setuptools openssl libffi-dev

安装pyenv并配置对应环境变量

这里我的Shell环境是ZSH,如果是Bash环境请修改对应 bashrc 文件

Bash
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

cat << EOF >>~/.zshrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOF

安装完成后,重新进入shell环境后使用pyenv,如安装正常应该有对应的帮助输出

以下是常用命令

Bash
# 所有可安装的版本列表
pyenv install -list    

# 下载制定版本的Python
pyenv install 3.6.9

# 查看当前已下载的版本
pyenv versions

# 设置系统的Python版本
pyenv global 3.6.9

# 设置当前目录为某个Python版本
pyenv local 3.6.9

# 更新pyenv
pyenv update

Visual Studio Code会自动识别当前目录的pyenv指定的版本

而Terminal在进入该目录时也会自动切换到该目录的Python版本

在一台PC上同一个版本的Python如何实现不同环境?可参考 virtualenv (虚拟环境)

打包问题

Pyenv在编译安装Python版本时默认不生成共享库(shared-library)

所以涉及到一些Python打包的问题,可能会有打包异常的问题

所以在使用Pyenv安装Python版本时,也可加入参数强制生成共享库,如下

Bash
env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.9

这个命令过长,每次安装版本都要输入非常不方便,可以考虑放到alias中命名为 pi

设置参考如下

Bash
echo "alias pi=\"env PYTHON_CONFIGURE_OPTS=\"--enable-shared\" pyenv install\"" >> ~/.zshrc

[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]