zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python编程:pyenv管理多个python版本环境

Python编程 环境 管理 版本 多个
2023-09-14 09:07:15 时间

pyenv 多版本的Python管理工具
https://github.com/pyenv/pyenv

pyenv-virtualenv 虚拟环境管理工具
https://github.com/pyenv/pyenv-virtualenv

macOS系统安装

$ brew install pyenv
$ brew install pyenv-virtualenv

配置环境变量

$ vim ~/.bash_profile

写入内容

# pyenv
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

配置生效

$ source ~/.bash_profile

问题:No module named ‘pyexpat’

Mac系统 10.14.10 下 安装Python,报错

$ pyenv install 3.7.0
No module named 'pyexpat'

解决方法

SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk \
MACOSX_DEPLOYMENT_TARGET=10.14 \ 
pyenv install 3.7.0

如果还提示openssl错误,那么使用如下方法

CPPFLAGS="-I/usr/local/opt/openssl@1.1/include" \
LDFLAGS="-L/usr/local/opt/openssl@1.1/lib" \
SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk \
MACOSX_DEPLOYMENT_TARGET=10.14 \
pyenv install 3.6.5

更多问题可参考
https://github.com/pyenv/pyenv/wiki/Common-build-problems

Mac 10.14 下 pyenv 安装 No module named ‘pyexpat’

其他系统安装

# 安装
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

# 卸载
$ rm -fr ~/.pyenv

配置vim ~/.bashrc

export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

参考:https://github.com/pyenv/pyenv-installer

使用

常用命令

pyenv install --list # 列出可安装版本
pyenv install <version> # 安装对应版本
pyenv install -v <version> # 安装对应版本,若发生错误,可以显示详细的错误信息

pyenv uninstall <version> # 卸载对应版本

pyenv versions # 显示当前使用的python版本
pyenv which python # 显示当前python安装路径
pyenv global <version> # 设置默认Python版本
pyenv local <version> # 当前路径创建一个.python-version, 以后进入这个目录自动切换为该版本
pyenv shell <version> # 当前shell的session中启用某版本,
# 优先级: shell > local > global

虚拟环境管理

pyenv virtualenvs # 列出当前虚拟环境

pyenv virtualenv env # 从默认版本创建虚拟环境
pyenv virtualenv 3.6.4 env-3.6.4 # 创建3.6.4版本的虚拟环境

pyenv activate env-3.6.4 # 激活 env-3.6.4 这个虚拟环境
pyenv deactivate # 停用当前的虚拟环境

pyenv uninstall env-3.6.4 # 删除 env-3.6.4 这个虚拟环境

相比这个,我还是比较喜欢virtualenvwrapper的指令

workon py3

当然可以修改别名

$ vim ~/.bash_profile

# 会出现过时提示
# alias workon="pyenv activate"

alias workon="pyenv shell"

.python-version文件

目录中有 .python-version 文件,进入目录后会自动切换到对应的Python版本


$ python --version
Python 2.7.16

$ cd /demo

# 创建 .python-version文件
$ pyenv lolcal py370

$ ls
.python-version

$ cat .python-version
py370

$ python --version
Python 3.7.0

参考
pyenv 安装及常用命令

pyenv下载速度慢

手动下载安装包
https://npm.taobao.org/mirrors/python/

放到目录下, 没有就新建

~/.pyenv/cache

遇到的问题

1、切换环境的时候会提示:

$ pyenv activate py370

prompt changing will be removed from future release. 
configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.

如果按照提示配置,切换版本后,没有了版本提示,不知道自己处于什么版本

修改配置文件 ~/.bash_profile

$ vim ~/.bash_profile

# pyenv
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1

# 添加版本号提示
export PS1='($(pyenv version-name)) '$PS1

可是这样会导致PyCharm命令行多一个版本提示,无法忍受

(py370)(py370) $

还有一个办法是使用

$ pyenv shell py370

参考:
pyenv intall 下载速度特别慢?
https://github.com/pyenv/pyenv-virtualenv/issues/135

Linux环境下安装pyenv

安装pyenv

1、设置安装目录

安装目录默认是PYENV_ROOT=${HOME}/.pyenv,如果需要多用户使用,那么会遇到一些权限问题

自定义安装目录,让所有用户都能用:

$ vim /etc/profile.d/custom.sh

# 设置目录 
# pyenv
export PYENV_ROOT=/opt/pyenv
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

2、设置pyenv及其插件下载源

如果直接使用官网给出的下载方式,默认直接从github下载安装, 会非常慢

$ curl https://pyenv.run | bash

# 或者
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

可以自动同步到gitee,并修改下载地址

(1)先手动下载安装文件

$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer > pyenv-installer.sh

(2)修改下载源

if [ -n "${USE_GIT_URI}" ]; then
#   GITHUB="git://github.com"
  GITHUB="git://gitee.com"
else
#   GITHUB="https://github.com"
  GITHUB="https://gitee.com/"
fi

# [github]pyenv -> [gitee]mouday
checkout "${GITHUB}/mouday/pyenv.git"            "${PYENV_ROOT}"
checkout "${GITHUB}/mouday/pyenv-doctor.git"     "${PYENV_ROOT}/plugins/pyenv-doctor"
checkout "${GITHUB}/mouday/pyenv-installer.git"  "${PYENV_ROOT}/plugins/pyenv-installer"
checkout "${GITHUB}/mouday/pyenv-update.git"     "${PYENV_ROOT}/plugins/pyenv-update"
checkout "${GITHUB}/mouday/pyenv-virtualenv.git" "${PYENV_ROOT}/plugins/pyenv-virtualenv"
checkout "${GITHUB}/mouday/pyenv-which-ext.git"  "${PYENV_ROOT}/plugins/pyenv-which-ext"

(3)执行安装命令

$ bash pyenv-installer.sh

或者直接使用已修改好的版本,通过gt工具进行下载

# 直接下载安装
$ wget https://raw.githubusercontent.com/mouday/gt-project/main/templates/template-pyenv-installer.sh | bash

# 或者使用 gt
$ gt pyenv-installer.sh | bash

安装Python

默认是从Python官网下载,如果速度慢可以修改下载源

更多变量可参考: python-build

$ vim /etc/profile.d/custom.sh

export PYTHON_BUILD_MIRROR_URL=https://npm.taobao.org/mirrors/python

或者,先手动下载到缓存文件夹中再安装

$ cd /usr/local/pyenv/cache

$ wget https://npm.taobao.org/mirrors/python/3.7.0/Python-3.7.0.tar.xz

安装Python和创建虚拟环境

# 安装
$ pyenv install 3.7.0

# 创建虚拟环境
$ pyenv virtualenv 3.7.0 py370

附件

完整版 pyenv-installer.sh

#!/usr/bin/env bash

set -e
[ -n "$PYENV_DEBUG" ] && set -x

if [ -z "$PYENV_ROOT" ]; then
  export PYENV_ROOT="${HOME}/.pyenv"
fi

colorize() {
  if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2"
  else echo -n "$2"
  fi
}

# Checks for `.pyenv` file, and suggests to remove it for installing
if [ -d "${PYENV_ROOT}" ]; then
  { echo
    colorize 1 "WARNING"
    echo ": Can not proceed with installation. Kindly remove the '${PYENV_ROOT}' directory first."
    echo
  } >&2
    exit 1
fi

failed_checkout() {
  echo "Failed to git clone $1"
  exit -1
}

checkout() {
  [ -d "$2" ] || git -c advice.detachedHead=0 clone --branch "$3" --depth 1 "$1" "$2" || failed_checkout "$1"
}

if ! command -v git 1>/dev/null 2>&1; then
  echo "pyenv: Git is not installed, can't continue." >&2
  exit 1
fi

if [ -n "${USE_GIT_URI}" ]; then
  # GITHUB="git://github.com"
  GITHUB="git://gitee.com"
else
  # GITHUB="https://github.com"
  GITHUB="https://gitee.com"
fi

# [github]pyenv -> [gitee]mouday
checkout "${GITHUB}/mouday/pyenv.git"            "${PYENV_ROOT}"                           "${PYENV_GIT_TAG:-master}"
checkout "${GITHUB}/mouday/pyenv-doctor.git"     "${PYENV_ROOT}/plugins/pyenv-doctor"      "master"
checkout "${GITHUB}/mouday/pyenv-installer.git"  "${PYENV_ROOT}/plugins/pyenv-installer"   "master"
checkout "${GITHUB}/mouday/pyenv-update.git"     "${PYENV_ROOT}/plugins/pyenv-update"      "master"
checkout "${GITHUB}/mouday/pyenv-virtualenv.git" "${PYENV_ROOT}/plugins/pyenv-virtualenv"  "master"
checkout "${GITHUB}/mouday/pyenv-which-ext.git"  "${PYENV_ROOT}/plugins/pyenv-which-ext"   "master"

if ! command -v pyenv 1>/dev/null; then
  { echo
    colorize 1 "WARNING"
    echo ": seems you still have not added 'pyenv' to the load path."
    echo
  } >&2

  { # Without args, `init` commands print installation help
    "${PYENV_ROOT}/bin/pyenv" init || true
    "${PYENV_ROOT}/bin/pyenv" virtualenv-init || true
  } >&2
fi

2023-01-03更新

通过实践,可以直接下载完整包,这样下载就速度就很快了

下载 pyenv-2.3.9-full

  • https://github.com/mouday/download/releases/download/upload/pyenv-2.3.9-full.tar.gz
  • https://gitee.com/mouday/download/releases/download/upload/pyenv-2.3.9-full.tar.gz

设置环境变量

cat /etc/profile.d/env.sh

# pyenv
export PYENV_ROOT=/opt/pyenv-2.3.9
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
pyenv -v
pyenv 2.3.9

安装Python编译依赖

yum install -y gcc make zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel

新建虚拟环境

# 通过镜像下载安装包
wget https://mirrors.huaweicloud.com/python/3.7.0/Python-3.7.0.tar.xz

# 将python安装包拷贝到缓存目录
cp Python-3.7.0.tar.xz /opt/pyenv-2.3.9/cache/Python-3.7.0.tar.xz

pyenv install 3.7.0

pyenv virtualenv 3.7.0 env-search

pyenv local env-search

python --version
Python 3.7.0 (default, Jan  3 2023, 08:23:42)

参考:https://github.com/pyenv/pyenv/wiki