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 还有virtualenv
、venv
可以使用,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"]