前言
日常开发中,我喜欢开发环境比实际运行环境高一个版本。因为这似乎有助于,让程序不断适应高版本的运行环境。
但是,今天遇到一个例外 — python。我系统默认的python版本是3.9,但是CI上的版本是3.6。众所周知,pyhton是不考虑向前兼容的。这导致我本地运行正常的代码,无法在CI上通过。
所以,我需要在本地切换python版本。
本次尝试使用 pyenv
对linux系统中的pyhton版本和虚拟环境进行管理。
pyenv的安装与简单使用
参考自:
- pyenv/pyenv: Simple Python version management
- Python多环境管理神器(pyenv) - doublexi - 博客园
# ref: https://github.com/pyenv/pyenv-installer# 当前用户安装pyenv
curl https://pyenv.run | bash# 如果正在使用的是bash的话,添加下面内容到~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"# 列出可安装的python版本
pyenv install --list# 因为不同版本的python是在本地编译的,建议准备好环境
# ref: https://github.com/pyenv/pyenv/wiki#suggested-build-environment# 安装指定版本,比如3.6.8
## 下面的命令会报错
pyenv install 3.6.8Installing Python-3.6.8...
/root/.pyenv/plugins/python-build/bin/python-build: line 1851: 409967 Segmentation fault (core dumped) "$PYTHON_BIN" -c "import $1"
WARNING: The Python ctypes extension was not compiled. Missing the libffi lib?
/root/.pyenv/plugins/python-build/bin/python-build: line 2072: 409974 Segmentation fault (core dumped) "$PYTHON_BIN" $python_opts -m ensurepip ${ensurepip_opts} > /dev/null 2>&1
Installing pip from https://bootstrap.pypa.io/pip/3.6/get-pip.py...
/root/.pyenv/plugins/python-build/bin/python-build: line 2048: 409998 Segmentation fault (core dumped) "${PYTHON_BIN}" -s "${get_pip}" ${GET_PIP_OPTS} 1>&4 2>&1
error: failed to install pip via get-pip.pyBUILD FAILED (AlmaLinux 9.3 using python-build 20180424)# ref:https://github.com/pyenv/pyenv/issues/2141
# 下面这样就没有问题了
CC=clang pyenv install 3.6.8# almaliux9上直接安装3.7版本是可以的
pyenv install 3.7# 查看当前已经安装的python版本
pyenv versions
* system (set by /root/.pyenv/version)3.7.17# 切换当前shell的python版本
pyenv shell 3.7.17
python --version
Python 3.7.17# 退出当前pyhotn版本,返回系统的python版本
pyenv shell --unset# 如果还需要在不同版本下,创建虚拟环境
pyenv help virtualenv
pyenv virtualenv 3.3.3 myproj3 # 创建虚拟环境
pyenv activate myproj3 # 激活虚拟环境
pyenv deactivate # 退出虚拟环境
pyenv uninstall myproj3 #删除虚拟环境
尝试修改安装路径-失败
上面使用脚本安装 pyenv
有一个缺点,默认安装在家目录。安装在家目录有个缺点是,不同用户之间不好共享这个程序。
所以我们将其安装到 /opt
目录下。下面的修改方法,对于当前的安装脚本有效。注意安装前,翻看下安装脚本。
参考:python - How to use pyenv with another user? - Stack Overflow
# root用户
# mkdir -p /opt/pyenv
# rm -rf /opt/pyenv# 指定安装位置
export PYENV_ROOT=/opt/pyenvcurl https://pyenv.run | bash# 如果正在使用的是bash的话,添加下面内容到~/.bashrc
export PYENV_ROOT=/opt/pyenv
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"# 安装一个版本
CC=clang pyenv install 3.6.8# 切换到普通用户,如上修改~/.bashrc后,
# pyenv会提示
pyenv: cannot rehash: /opt/pyenv/shims isn't writable# 能不能让shims,对于不同用户放在不同目录呢?# 不同用户使用pyenv,还是各用各的吧。都安装下,也不麻烦