Python虚拟环境的使用
不同的python项目,可能会使用不同的python版本,也会使用同一个包的不同版本。为了解决依赖冲突问题,我们为不同项目建立不同的虚拟环境,来实现依赖包的隔离+版本锁定。
venv
venv是python(3.3以上版本)自带的轻量级虚拟环境管理工具。
1、创建虚拟环境
# 创建名为 myenv 的虚拟环境目录
python -m venv myenv
2、进入虚拟环境
source myenv/bin/activate
3、安装依赖包
pip install requests numpy # 安装单个包
pip install -r requirements.txt # 通过文件批量安装
pip list # 查看当前环境已安装的包
4、退出虚拟环境
deactivate
5、实践中的注意事项
将虚拟环境目录(如 .venv
)置于项目根目录,并通过 .gitignore
忽略,避免纳入版本控制。
定期运行 pip freeze > requirements.txt
保存依赖列表,确保环境可复现
Pipenv
参考文档:https://github.com/pypa/pipenv,https://pipenv.pypa.io/zh-cn/latest/basics.html
Pipenv 是 Python 的官方推荐(由 PyPA 认可)的依赖管理和虚拟环境工具。它旨在将 pip
(包安装)、virtualenv
(虚拟环境创建)和 Pipfile
(依赖声明)的功能结合在一个命令行工具中,提供更简洁、更一致的工作流。
1、安装Pipenv
pip install pipenv # 推荐用户级安装
2、创建虚拟环境
pipenv install
会生成一个Pipfile,格式如下
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"[packages]
django = "~=4.0" # 兼容版本(4.0.x)
requests = "*" # 任意版本(不推荐)
flask = { version = ">=2.0.1", extras = ["dotenv"] } # 带额外特性
numpy = "==1.23.5" # 精确版本[dev-packages]
pytest = ">=7.0" # 最小版本
coverage = "*"[requires]
python_version = "3.10" # 指定Python版本[scripts]
start = "python manage.py runserver"
test = "pytest -v"
lint = "flake8 ."
3、进入虚拟环境
pipenv shell
退出虚拟环境
deactivate
4、生成锁定版本的Pipfile.lock文件
手动编辑 Pipfile
后,运行 pipenv lock
来生成新的 Pipfile.lock
,确保依赖被锁定。
5、命令的说明
check Checks for PyUp Safety security vulnerabilities and againstPEP 508 markers provided in Pipfile.clean Uninstalls all packages not specified in Pipfile.lock.graph Displays currently-installed dependency graph information.install Installs provided packages and adds them to Pipfile, or (if nopackages are given), installs all packages from Pipfile.lock Generates Pipfile.lock.open View a given module in your editor.requirements Generate a requirements.txt from Pipfile.lock.run Spawns a command installed into the virtualenv.scripts Lists scripts in current environment config.shell Spawns a shell within the virtualenv.sync Installs all packages specified in Pipfile.lock.uninstall Uninstalls a provided package and removes it from Pipfile.update Runs lock, then sync.upgrade Update the lock of the specified dependency / sub-dependency,but does not actually install the packages.verify Verify the hash in Pipfile.lock is up-to-date.
6、实践中的注意事项
总是将 Pipfile
和 Pipfile.lock
一起提交到版本控制系统,确保团队环境一致。
在生产环境中根据 Pipfile.lock 安装精确依赖 (推荐方式):pipenv install --deploy --ignore-pipfile
在Docker中使用Pipenv部署Python应用时,无需创建虚拟环境:pipenv install --system --deploy --ignore-pipfile
7、Dockerfile 示例
# 阶段 1: 构建环境
FROM python:3.10-slim as builder# 安装系统依赖(根据应用需要调整)
RUN apt-get update && \apt-get install -y --no-install-recommends gcc build-essential && \rm -rf /var/lib/apt/lists/*# 安装 pipenv
RUN pip install --no-cache-dir pipenv# 设置工作目录
WORKDIR /app# 复制依赖声明文件(利用 Docker 缓存层)
COPY Pipfile Pipfile.lock ./# 安装依赖到系统(不创建虚拟环境)
RUN pipenv install --system --deploy --ignore-pipfile# 阶段 2: 运行时镜像
FROM python:3.10-slim as runtime# 安装运行时依赖(如需要)
# RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*# 从构建阶段复制已安装的包
COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin# 设置工作目录
WORKDIR /app# 复制应用代码
COPY . .# 设置环境变量
ENV PYTHONUNBUFFERED=1 \PYTHONDONTWRITEBYTECODE=1# 暴露端口(根据应用调整)
EXPOSE 8000# 启动命令
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]