Skip to main content

Python 多版本管理工具

MarshioAbout 7 minpythonspider

管理多个Python版本和它们的虚拟环境对于任何需要在不同项目间切换的开发者来说都是一项基础技能。从官方的 venv 到强大的 pyenv 和其他第三方工具,Python社区提供了一系列的工具来简化这一过程。

本文将为你提供一个全面(现在还不全,未来会全的)的指南,帮助你掌握这些工具的使用方法。

前言

我们首先需要知道,python版本管理工具,python环境管理工具,python包管理工具,这三个之间的区别。

  • python版本管理工具:决定了你的计算机默认执行python的版本,如conda,pyenv,当你的不同项目需要不同的python版本的时候你就需要进行多版本管理了
  • python环境管理工具:支持创建python虚拟环境,如venv,virtualenv,pipenv等,当你的不同项目需要同一个包的不同版本时,你就需要进行虚拟环境管理了
  • python包管理工具:支持python依赖包的管理,如pip,pipenv等,类似于前端的npm,后端的maven

我个人的搭配是 pyenv + pipenv,pyenv用于管理python的多个版本需求,pipenv用于管理python的多个虚拟环境以及依赖包。

pyenv

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.

重点:支持多版本创建、切换。

如果你有一个项目依赖的 python 版本为 3.8 ,另一个项目依赖的 python 版本为 3.9,你需要在服务器上下载多个 python ,但是在使用的时候其实是很不方便的,这时候,如果你有 pyenv 就很好了。

install

pyenv-installeropen in new window

windows
# 下载链接1
curl https://pyenv.run | bash


# 下载链接2
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

查看和删除

# 查看已经下载的 python 版本,包括系统自带的
pyenv versions

# 全局切换 python 版本
pyenv global 3.8.0

# 局部切换 python 版本
pyenv local 3.8.0

# 删除已经下载的 python 版本
pyenv uninstall 3.9.0

config

# 安装完成,我收到了下面的提示
WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by appending
# the following to
# ~/.bash_profile if it exists, otherwise ~/.profile (for login shells)
# and ~/.bashrc (for interactive shells) :

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# Restart your shell for the changes to take effect.

# Load pyenv-virtualenv automatically by adding
# the following to ~/.bashrc:

eval "$(pyenv virtualenv-init -)"

根据如上提示,我们选择 ~/.profile

编辑 ~/.profile

vim ~/.profile

插入如下配置

# pyenv
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

重启 shell

# 可以直接重启 shell
source ~/.profile 

验证

pyenv --version

pyenv 2.4.7

使用

列出可安装的版本

pyenv install --list

# 输出
3.8.0
3.8-dev
3.8.1
3.8.2
3.8.3
3.8.4
3.8.5
3.8.6
3.8.7

安装特定版本

pyenv install ${version}

pyenv install 3.8.0

# 当然国内下载是非常非常慢的

# 因为 pyenv 会将下载的包先放到 ~/.pyenv/cache 目录下
# 所以我们可以使用国内镜像先将要下载的东西放过来

# 通过如下命令下载,将版本替换成自己的版本
wget https://mirrors.huaweicloud.com/python/3.8.0/Python-3.8.0.tar.xz -P ~/.pyenv/cache/

# 执行安装
pyenv install 3.8.0 -v

# 安装后 python 执行器放在 ~/.pyenv/versions/3.8.0 包下

pyenv virtualenvs

pyenv-virtualenv 是一个 pyenv 的插件,需要单独下载才能使用,它提供了创建和管理虚拟环境的功能。

创建虚拟环境

# 基于 3.8.0 创建一个名为 python-3.8.0-demo 的虚拟环境
pyenv virtualenv 3.8.0 python-3.8.0-demo

列出所有的虚拟环境

pyenv virtualenvs

激活虚拟环境

pyenv activate python-3.8.0-demo

停用虚拟环境

pyenv deactivate

删除虚拟环境

pyenv uninstall python-3.8.0-demo

查看当前的虚拟环境

# 查看当前虚拟环境的 python 版本
pyenv version

常见问题

解决方案查看Common-build-problemsopen in new window

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/root/.pyenv/versions/3.8.0/lib/python3.8/bz2.py", line 19, in <module>
    from _bz2 import BZ2Compressor, BZ2Decompressor
ModuleNotFoundError: No module named '_bz2'
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/root/.pyenv/versions/3.8.0/lib/python3.8/curses/__init__.py", line 13, in <module>
    from _curses import *
ModuleNotFoundError: No module named '_curses'
WARNING: The Python curses extension was not compiled. Missing the ncurses lib?
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/root/.pyenv/versions/3.8.0/lib/python3.8/ctypes/__init__.py", line 7, in <module>
    from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'
WARNING: The Python ctypes extension was not compiled. Missing the libffi lib?
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'readline'
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/root/.pyenv/versions/3.8.0/lib/python3.8/ssl.py", line 98, in <module>
    import _ssl             # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl'
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (Ubuntu 22.04 using python-build 2.4.7)

Inspect or clean up the working tree at /tmp/python-build.20240711110235.34532
Results logged to /tmp/python-build.20240711110235.34532.log

Last 10 log lines:
        LD_LIBRARY_PATH=/tmp/python-build.20240711110235.34532/Python-3.8.0 ./python -E -m ensurepip \
                $ensurepip --root=/ ; \
fi
/tmp/tmp63zi22uj/pip-19.2.3-py2.py3-none-any.whl/pip/_vendor/ipaddress.py:1106: SyntaxWarning: 'str' object is not callable; perhaps you missed a comma?
/tmp/tmp63zi22uj/pip-19.2.3-py2.py3-none-any.whl/pip/_vendor/ipaddress.py:1106: SyntaxWarning: 'str' object is not callable; perhaps you missed a comma?
Looking in links: /tmp/tmp63zi22uj
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip

pipenv

集成 pip 和 virtualenv

下载

pip
pip install pipenv

创建虚拟环境

# 使用python 3.8 版本创建一个虚拟环境,虚拟环境的名称默认为当前文件名+随机字符串
pipenv --python 3.8


# llm-demo是我当前的目录
✔ Successfully created virtual environment!
Virtualenv location: /Users/xxx/.local/share/virtualenvs/llm-demo-kmX_Jdme

查看虚拟环境

pipenv --venv

激活虚拟环境

# 如果当前目录或其上N级目录没有对应的虚拟环境,则会创建一个虚拟环境并激活该虚拟环境
pipenv shell

# 如果当前目录或其上N级目录有虚拟环境,则直接启动该虚拟环境,并会进入项目的根目录下

退出虚拟环境

exit

删除虚拟环境

# 需要先处于项目根目录下执行该命令
pipenv --rm

下载依赖到虚拟环境

pipenv install requests

# 安装依赖到开发环境
pipenv install pytest --dev

# 从指定的依赖文件下载依赖
pipenv install -r requirements.txt

生成或更新 Pipfile

pipenv lock

conda

重,但功能丰富,基本涵盖开发python中遇到各种问题所需要的解决方案。

venv

venv 是 python 官方在 python 3.3 版本内置的一个标准库模块,用于创建虚拟环境,帮助用户快速创建干净、完全隔离的且不同版本的 python 解释器以便在不同项目中开发。

venv 本身不提供 python 版本的创建,而是直接依赖服务器的 python ,如果想要创建其他版本的 python,需要选择其他版本管理。

venv 重点是帮助用户创建虚拟环境,如果没有多版本的困扰,这对你来说是一个不错的选择。

python-version >= 3.3

安装

apt install python3.x-venv

创建虚拟环境

# 我这里是创建了一个python3.8的虚拟环境,python版本仍然是默认的python
python3 -m venv python3.8

激活虚拟环境

source python3.8/bin/activate

退出虚拟环境

deactivate

virtualenv

pyenv + pipenv

创建项目

命令行

mkdir demo-pipenv

cd demo-pipenv 

# 使用python 3.12 版本创建一个虚拟环境,虚拟环境的名称默认为当前文件名+随机字符串
pipenv --python 3.12

# output
Creating a virtualenv for this project
Pipfile: /Users/xxx/Projects/python-projects/pyspider/Pipfile
Using /Users/xxx/.pyenv/versions/3.12.0/bin/python33.12.0 to create virtualenv...
⠹ Creating virtual environment...created virtual environment CPython3.12.0.final.0-64 in 197ms
  creator CPython3Posix(dest=/Users/xxx/.local/share/virtualenvs/pyspider-2k-JWV58, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/Users/xxx/Library/Application Support/virtualenv)
    added seed packages: pip==25.1.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

⠸ Creating virtual environment...✔ Successfully created virtual environment!
Virtualenv location: /Users/xxx/.local/share/virtualenvs/pyspider-2k-JWV58
Creating a Pipfile for this project...

pycharm

1、选择 Location

2、Interpreter type(解释器类型)选择 Custom environment

3、Environment 选择 Generate new

4、Type 选择 pipenv

5、Base python 选择你想要的 python 版本

6、path to pipenv 选择你的 pipenv 的可执行脚本路径

创建完成后会生成一个 Pipfile 的文件,用来管理依赖

# 可以查看当前虚拟环境 
pipenv --venv

# 使用 pipenv 下载依赖
pipenv install requests