TATECHATLAS
◎ 简体中文
编程

创建 Python 虚拟环境,避免依赖混用

从项目环境开始,并确认 pip 使用了正确的 Python。

本文内容

每个项目建立一个虚拟环境,并通过该环境的 Python 安装包。这样不会把项目依赖装入其他项目或系统 Python。

先确定要使用的 Python 版本

虚拟环境能够隔离依赖,但仍然依赖创建它时使用的 Python。先查看项目要求的版本。如果电脑上有多个 Python,应明确选择目标解释器,不要假设 python 命令一定指向想要的版本。

在项目根目录创建 .venv,应用代码应放在它旁边,而不是里面。更换电脑或 Python 版本时,环境应该可以重新创建。下面是 Linux 和 macOS 的常用方式;部分 Linux 发行版需要额外安装提供 venv 的系统软件包。

python3 --version
python3 -m venv .venv
source .venv/bin/activate

Windows PowerShell:不激活也能使用

Windows 上的 py -m venv .venv 使用启动器选择的 Python。如果项目需要某个已安装版本,可以明确指定,例如 py -3.12 -m venv .venv。随后使用下面的 PowerShell 命令激活。

如果脚本执行策略阻止 Activate.ps1,可以直接调用环境里的 python.exe。安装依赖并不要求为此修改执行策略。激活只调整当前终端的环境,虚拟环境本身并不依赖这一步才能工作。

py -m venv .venv
.\.venv\Scripts\Activate.ps1

# Direct use without activation:
.\.venv\Scripts\python.exe -m pip --version

确认 Python 和 pip 指向同一个环境

命令提示符出现 .venv 可以作为提示,但 sys.executable 更直接:显示的路径应位于当前项目的 .venv 内。python -m pip --version 还会显示 pip 的安装位置。请在实际启动应用的终端中检查。

然后在编辑器中选择同一个解释器。ModuleNotFoundError 的常见原因是:一个终端安装了依赖,编辑器或服务器却使用另一个 Python。如果使用 notebook,还要检查所选内核。

python -c "import sys; print(sys.executable)"
python -m pip --version

按照项目要求安装依赖

如果项目有 requirements.txt,应使用虚拟环境中的 Python 安装该文件。新建 Django 项目时,python -m pip install Django 会把 Django 装入当前环境。已有项目则应遵循其依赖文件,避免意外替换约定的版本。

固定版本有助于重现安装。不过,pip freeze 只列出已安装的发行包,不记录操作系统或 Python 版本,还可能包含临时开发工具。将其作为项目依赖清单之前,需要先检查内容。

python -m pip install -r requirements.txt
python -m pip check

换电脑时重新创建环境

将 .venv 排除在 Git 和部署归档之外。虚拟环境可能保存绝对解释器路径,并包含特定平台的二进制依赖,直接在 Windows 与 Linux 之间复制并不可靠。应传输源码和依赖文件,然后在目标机器重新创建环境。

服务器服务或定时任务可以使用解释器的完整路径启动。不必一直保持某个终端处于激活状态,也不必保持终端窗口打开。完整路径还让服务实际使用的 Python 一目了然。

安装之后仍然报错时怎么排查

如果环境里没有 pip,可尝试使用其 Python 执行 -m ensurepip --upgrade,前提是这份 Python 支持 ensurepip。若创建时选错了 Python 版本,应重新创建环境,而不是试图原地转换。

依赖仍然找不到时,比较 sys.executable、pip 位置以及编辑器选择的解释器。重试前先阅读安装错误:编译失败、版本不兼容与装错环境是不同问题。deactivate 用来退出当前终端的激活状态。

python -m pip show Django
deactivate

检查清单

  • 源代码放在 .venv 之外。
  • 使用目标解释器执行 python -m pip。
  • 不要把虚拟环境目录提交到 Git。

需要支持 venv 的 Python 安装。不同终端的激活命令不同。

参考来源

  1. Python: venv ↗
  2. Python Packaging User Guide ↗
  3. pip user guide ↗
  4. Python: sys ↗
  5. Python: ensurepip ↗
返回顶部 ↑