Skip to content

虚拟环境与包管理 ​

学习目标 ​

  • 为每个项目创建并激活独立虚拟环境。
  • 使用 pip 安装、升级、卸载和导出依赖。
  • 理解 requirements.txt、锁定版本和可复现安装。

核心知识点 ​

虚拟环境隔离项目解释器与第三方包,避免不同项目互相污染。venv 创建环境,python -m pip 确保调用的是当前解释器对应的 pip。应用依赖应记录版本范围或锁文件,开发工具可单独分组。

常用用法 ​

venv.EnvBuilder ​

python
from pathlib import Path
from tempfile import TemporaryDirectory
import venv

with TemporaryDirectory() as name:
    target = Path(name) / ".venv"
    venv.EnvBuilder(with_pip=False).create(target)
    print(target.is_dir())
    # 输出:True

真实项目通常直接运行 python -m venv .venv;示例用 with_pip=False 避免在文档运行时下载依赖。

powershell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
bash
python3 -m venv .venv
source .venv/bin/activate

激活与退出虚拟环境 ​

python
import sys

print(sys.prefix != sys.base_prefix)
# 输出:True(在已激活的虚拟环境中)

激活只是修改当前 shell 的 PATH;脚本也可以直接调用 .venv 里的解释器。

powershell
deactivate
bash
deactivate

python -m pip install ​

python
import sys

pip_command = [sys.executable, "-m", "pip", "install", "requests"]
print(" ".join(pip_command))
# 输出:<当前解释器路径> -m pip install requests

文档中的安装命令使用 shell 执行;Python 示例只展示“跟随当前解释器”的原则。

powershell
python -m pip install requests
bash
python -m pip install requests

pip freeze 与 requirements 文件 ​

python
requirements = ["requests==2.32.3", "pytest==8.3.3"]
print("\n".join(requirements))
# 输出:requests==2.32.3\npytest==8.3.3

示例版本只是格式说明,实际版本应按项目兼容性和安全更新维护。

powershell
python -m pip freeze > requirements.txt
python -m pip install -r requirements.txt
bash
python -m pip freeze > requirements.txt
python -m pip install -r requirements.txt

importlib.metadata.version() ​

python
from importlib.metadata import version

try:
    installed = version("pip")
except Exception:
    installed = "not installed"
print(installed != "not installed")
# 输出:True(当前环境安装 pip 时)

读取已安装包元数据时使用标准库 importlib.metadata,不要从包内部私有变量猜版本。

pip check ​

python
check_command = "python -m pip check"
print(check_command)
# 输出:python -m pip check

pip check 检查已安装包的依赖冲突;它不是完整的安全扫描或测试套件。

powershell
python -m pip check
bash
python -m pip check

不常用但需要知道 ​

--upgrade 与卸载 ​

python
commands = [
    "python -m pip install --upgrade pip",
    "python -m pip uninstall requests",
]
print("; ".join(commands))
# 输出:python -m pip install --upgrade pip; python -m pip uninstall requests

升级前查看兼容性,卸载前确认没有其他项目或工具依赖该包。

powershell
python -m pip install --upgrade pip
python -m pip uninstall requests

.gitignore 忽略 .venv ​

python
gitignore_entry = ".venv/"
print(gitignore_entry)
# 输出:.venv/

虚拟环境包含平台相关二进制,不应提交到仓库;提交依赖声明和安装说明即可。

gitignore
.venv/

pip list --outdated ​

python
command = "python -m pip list --outdated"
print(command)
# 输出:python -m pip list --outdated

升级依赖要配合测试和变更日志,不能把“最新”当成“兼容”。

powershell
python -m pip list --outdated

易混点 ​

  • 激活虚拟环境只影响当前 shell;新终端需要重新激活。
  • pip 可能指向另一个 Python,优先使用 python -m pip。
  • requirements.txt 是安装输入/输出格式,不等于完整锁文件。
  • 不要把 .venv 提交到 Git,也不要手动修改其中的包文件。
  • 升级包后要运行测试和 pip check,并审查重大版本变化。

课后小问 ​

  1. 为什么推荐 python -m pip 而不是直接执行 pip? 答案:它明确使用当前 python 解释器关联的 pip。 解析:多 Python 版本共存时,直接写 pip 很容易把包安装到错误环境。

  2. 应不应该把整个 .venv 提交到仓库? 答案:不应该。 解析:环境与平台、解释器路径和二进制相关,应提交依赖声明,让其他人重新创建环境。

本节小结 ​

每个项目独立 .venv,所有安装命令绑定当前解释器,依赖变更后测试并记录;这是“能在我机器上运行”走向可复现的第一步。

快速回顾 ​

  • 创建:python -m venv .venv
  • 激活:PowerShell Activate.ps1,Unix source
  • 安装:python -m pip install
  • 依赖:freeze、-r requirements.txt
  • 校验:python -m pip check