虚拟环境与包管理
学习目标
- 为每个项目创建并激活独立虚拟环境。
- 使用
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.ps1bash
python3 -m venv .venv
source .venv/bin/activate激活与退出虚拟环境
python
import sys
print(sys.prefix != sys.base_prefix)
# 输出:True(在已激活的虚拟环境中)激活只是修改当前 shell 的 PATH;脚本也可以直接调用 .venv 里的解释器。
powershell
deactivatebash
deactivatepython -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 requestsbash
python -m pip install requestspip 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.txtbash
python -m pip freeze > requirements.txt
python -m pip install -r requirements.txtimportlib.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 checkpip check 检查已安装包的依赖冲突;它不是完整的安全扫描或测试套件。
powershell
python -m pip checkbash
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,并审查重大版本变化。
课后小问
为什么推荐
python -m pip而不是直接执行pip? 答案:它明确使用当前python解释器关联的 pip。 解析:多 Python 版本共存时,直接写pip很容易把包安装到错误环境。应不应该把整个
.venv提交到仓库? 答案:不应该。 解析:环境与平台、解释器路径和二进制相关,应提交依赖声明,让其他人重新创建环境。
本节小结
每个项目独立 .venv,所有安装命令绑定当前解释器,依赖变更后测试并记录;这是“能在我机器上运行”走向可复现的第一步。
快速回顾
- 创建:
python -m venv .venv - 激活:PowerShell
Activate.ps1,Unixsource - 安装:
python -m pip install - 依赖:
freeze、-r requirements.txt - 校验:
python -m pip check
阿源的知识库