版本管理文件
python工程中有如下几个文件涉及到版本
pyproject.toml: 只管理顶层依赖,面相开发者
uv.lock:使用uv sync根据pyproject.toml生成&更新,如果版本不一致则会提示
requirements.txt:使用uv pip install -r requirements.txt生成的,是对pip的兼容
pyproject.toml这个文件优先级最高,如果uv.lock,或者venv环境不一致自动同步。或者使用uv sync和uv lock同步

uv和pip混合使用场景
问题场景:如果pyproject.tom pytest==9.1.0,生成requirements.txt,修改requirements.txt文件:pytest==9.1.1。这时候在一个新venv环境执行pip install -r requirements.txt文件,mytest版本就是9.1.1。再执行uv lock,uv sync后,那么pytest==9.1.0。这时候再次执行pip list,pytest==9.1.1。这个就矛盾了,这时候我理解版本pip list的pytest的版本应该被uv sync给降下来了,怎么还是9.1.1呢

# 查看虚拟路径
(dev2) D:\workspace3\py-vue-1\backend>echo %VIRTUAL_ENV%
D:\workspace3\py-vue-1\backend\dev2
# 查看pip使用的命令位置
(dev2) D:\workspace3\py-vue-1\backend>where pip
C:\Users\****\AppData\Local\Python\bin\pip.exe
可以看出直接用pip install -r requirements.txt 是安装到全局,而dev的实际依赖是9.1.0,不是requirements.txt文件设置的9.1.1。说明生效的uv sync命令。

# uv tree 显示的是默认.venv 环境下的依赖包,而非当前dev2 环境。
(dev3) D:\workspace3\py-vue-1\backend>uv tree
Resolved 16 packages in 5ms
backend v0.1.0
├── pydantic-core v2.48.0
│ └── typing-extensions v4.16.0
├── httpx v0.28.1 (group: dev)
│ ├── anyio v4.14.2
│ │ └── idna v3.18
│ ├── certifi v2026.7.22
│ ├── httpcore v1.0.9
│ │ ├── certifi v2026.7.22
│ │ └── h11 v0.16.0
│ └── idna v3.18
├── pytest v9.1.0 (group: dev)
│ ├── colorama v0.4.6
│ ├── iniconfig v2.3.0
│ ├── packaging v26.3
│ ├── pluggy v1.6.0
│ └── pygments v2.20.0
└── pytest-asyncio v1.4.0 (group: dev)
└── pytest v9.1.0 (*)
(*) Package tree already displayed
**# 使用pip install -r requirements.txt是不准确的,**需要用uv pip install -r requirements.txt,这样就可以安装到当前venv环境,查看使用uv pip list | findstr pytest查看。

dev3实际依赖:

经验结论
-
uv和pip不要混合使用
-
uv的一些命令,在多venv环境下,可能只找默认的.venv环境,需要注意
-
uv.lock和requirements.txt作为pyproject.tmol文件的单向生成文件,不要手动修改