一个项目,一套库
项目需要 numpy、pandas 之类的第三方库,不同项目需要的版本又各不相同。把所有东西都装进同一个共享的 Python 会导致版本冲突:为一个项目升级会弄坏另一个。虚拟环境是一个私有文件夹,里面有自己的一份 Python 解释器和自己安装的库,因此每个项目都能拥有恰好需要的内容。pip 是从 Python 包索引(PyPI)下载库并安装到当前环境的工具。
# Create an environment in the project folder (once)
python -m venv .venv
# Activate it (every new terminal)
source .venv/bin/activate # macOS and Linux
.venv\Scripts\activate # Windows
# The prompt now shows (.venv); python and pip belong to it
python -c "import sys; print(sys.prefix)"
# Leave it
deactivate用 pip 安装
环境激活后,pip install numpy 添加一个库,pip install numpy==1.26.4 固定精确版本,pip install -U numpy 升级,pip uninstall numpy 卸载。pip list 显示已安装的内容。拿不准时用 python -m pip 调用,这能保证它属于你将运行的同一个 Python。永远不要用 sudo pip,也不要装进系统 Python。
# Install, pin and inspect (environment active)
python -m pip install numpy pandas
python -m pip install "scipy>=1.11,<2"
python -m pip list
# Show one library
python -m pip show numpyrequirements.txt 与版本规则
依赖文件每行列出项目需要的一个库,这样任何人都能用 pip install -r requirements.txt 重建环境;pip freeze > requirements.txt 会写出当前安装的精确版本。每一行是库名加一个可选的版本限定符:==1.26.4(恰好)、>=2.0(至少)、<3(低于)、!=2.1(除此之外)、~=1.4.2(兼容:至少 1.4.2 但仍是 1.4.x)。以 # 开头的行是注释。版本按各部分作为数字比较,所以 1.10 比 1.9 新,而不是旧。
# A version is a tuple of numbers, not a string
print("1.10" > "1.9") # False (text order is wrong!)
def version_tuple(text):
return tuple(int(part) for part in text.split("."))
print(version_tuple("1.10") > version_tuple("1.9")) # True
print(version_tuple("2.0.1")) # (2, 0, 1)
# Reading one requirements line
line = "numpy>=1.26 # for arrays"
name_and_spec = line.split("#", 1)[0].strip()
print(name_and_spec) # numpy>=1.26让项目可复现的好习惯
每个项目创建一个环境,放在项目内并命名为 .venv,但不要提交它:它体积大,且只适用于你的机器。应提交 requirements.txt(或 pyproject.toml)。对需要的内容写宽松规则(>=),在必须复现结果时固定精确版本(==)。如果出了问题,随时可以删除 .venv,并用依赖文件在一分钟内重建。
# requirements.txt
numpy==1.26.4 # pinned: reproduce results exactly
pandas>=2.0 # at least 2.0
scipy~=1.11.0 # 1.11.x, but not 1.12
# plotting waits until we need it
# Rebuild the environment anywhere
python -m venv .venv
python -m pip install -r requirements.txt
# Record what is installed right now
python -m pip freeze > requirements.txtimport 失败。安装任何东西之前,先确认提示符显示 (.venv),并且 python -c "import sys; print(sys.prefix)" 指向你的项目内部。python -m venv .venv然后激活:每个项目一个环境。python -m pip install name==version、pip install -r requirements.txt、pip freeze。- 限定符有
==、>=、<、!=、~=;版本按数字元组比较;提交依赖文件,而不是.venv。
下一节:Git 基础,跟踪代码的每一次改动,出问题时能够回退。
实验:评分内容
- 用
parse_requirement解析一行依赖25 分 - 用
parse_requirements解析整个依赖文件25 分 - 用
version_tuple让版本可以比较25 分 - 用
satisfies检查版本是否符合规则25 分