Linux 和 MacOS 系统都自带了 Python,对于初学者来说是件好事,不用安装也能直接使用。但是在工程开发上往往需要在不同的项目使用不同的 Python 版本,相同的 Python 下使用不同的依赖。

在最新的 Ubuntu、Manjaro 等系统中直接使用 pip install 安装依赖时,会提示可能会破坏系统依赖(PEP 668 (opens new window))。所以Python 官方的态度是不推荐直接使用系统自带的 Python 环境来安装依赖、进行过多的开发工作,而是推荐使用虚拟环境,或者干脆装一个新的 Python。

因此,我们需要工具来管理 Python 版本和虚拟环境。

  • Pyenv:Python 版本管理工具,类似于 NodeJS 的 nvm
  • Pipenv:Python 虚拟环境管理工具,类似于 NodeJS 的 npm。Python 还有 virtualenvvenv 可以使用,Pipenv 的优势在于提供了 lock 文件,保证在不同的环境使用相同的依赖运行程序。

Pyenv + Pipenv 二者还会有联动:如果 pipenv 的版本管理文件 Pipfile 指定了 Python 版本,pipenv shell 进入虚拟环境时,会自动使用 pyenv 安装的 Python 版本创建虚拟环境,确保了项目使用的 Python 版本与 Pipfile 中的声明一致。安装好 Pyenv 和 Pipenv 以后,就不用再操心当前的 Python 和项目的 Python 版本是否一致了。

# 安装 Pyenv

安装 Pyenv,然后安装 Python 3.10:

curl https://pyenv.run | bash

# 配置好 .bashrc 以后
pyenv install 3.10
pyenv shell 3.10

which python      # 输出 /home/liu/.pyenv/shims/python
python --version  # 输出 Python 3.10.15

pyenv versions    # 查询 pyenv 安装的所有 Python 版本

# Setup Pipenv

安装 Pipenv

pip install pipenv  # pyenv shell 3.10 以后,这里使用的是 pyenv 安装的 Python
pipenv shell        # 进入虚拟环境

# 在虚拟环境中安装现有依赖
pipenv install

添加现有依赖也需要使用 pipenv,因为使用 pip 安装的依赖不会写到 Pipfile 里。

pipenv install <package>

# 运行项目

pipenv shell

# 在虚拟环境中运行项目
python3 src/main.py

# 为项目构建 Docker 镜像

在 Docker 里构建容器也需要下载依赖。和开发环境不同的是,构建 Docker 镜像不需要 Pyenv,也不需要创建虚拟环境,所以会有一点区别。

# use mirror of python:3.10
FROM python:3.10

# install pipenv using tsinghua mirror
RUN pip install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple

WORKDIR /app
COPY Pipfile Pipfile.lock /app/
RUN pipenv install --deploy --system

COPY . /app
CMD ["python", "src/main.py"]