uv 自动识别项目上下文:优先检查 VIRTUAL_ENV,再逐级查找 .venv,最后依据 pyproject.toml 或 requirements.txt 创建;uv sync 有 uv.lock 则直接安装,无则解析生成,无配置文件则报错。

uv 怎么自动找到当前项目的 .venv 和 uv.lock
uv 不需要你手动激活虚拟环境,它靠目录扫描和文件存在性自动识别项目上下文。只要你在项目根目录(含 pyproject.toml 或 uv.lock)下运行命令,uv 就会按固定顺序查找环境:
- 优先检查
VIRTUAL_ENV环境变量(即你已手动激活的 venv) - 没设的话,找当前目录或向上逐级父目录中的
.venv文件夹 - 再没找到,就看有没有
pyproject.toml或requirements.txt—— 有就自动创建.venv并用它
也就是说,uv sync、uv add requests 这类命令,在项目根目录执行时,根本不用 source .venv/bin/activate。它自己会进 .venv 装包、读 uv.lock、写 pyproject.toml。
为什么 uv sync 有时不装包,有时报错找不到 lock 文件
uv sync 的行为完全取决于当前目录里有什么文件:
- 有
uv.lock→ 直接按锁文件安装,跳过解析,最快最稳 - 没有
uv.lock但有pyproject.toml→ 先解析依赖生成uv.lock,再安装 - 只有
requirements.txt→ 默认当纯文本处理,不自动生成 lock;需加--locked才校验一致性 - 啥都没有 → 报错
No pyproject.toml or requirements.txt found
常见误操作:删了 uv.lock 又没改 pyproject.toml,直接 uv sync 会重新生成 lock,但版本可能和之前不同 —— 这不是 bug,是预期行为。
pyproject.toml 里哪些字段影响 uv 的自动识别逻辑
uv 主要看 [project] 和 [tool.uv] 两个 section:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
[project.dependencies]:声明直接依赖,uv sync和uv add都以它为基准 -
[project.optional-dependencies]:比如dev = ["pytest", "ruff"],要用uv add --dev才装 -
[tool.uv.index-url]:指定镜像源,不写就走默认 PyPI,写了就全程生效(包括uv python install) -
[project.requires-python]:比如">=3.10,,uv python pin会据此选版本
注意:[build-system] 或 [project.urls] 这类字段 uv 完全忽略,不影响环境识别。
跨目录执行 uv 命令时环境识别会失效吗
会。uv 的自动识别只基于**当前工作目录(PWD)**,不追踪 git root 或其他标记:
- 你在
/path/to/myproj/src下执行uv add fastapi→ uv 会往上找myproj/pyproject.toml,但如果没找到,就报错 - 想强制指定项目根,用
--cwd /path/to/myproj,例如:uv sync --cwd /path/to/myproj -
uv run是个例外:它支持相对路径脚本,比如uv run ./scripts/deploy.py,会自动把./scripts的父目录当项目根
最稳妥的做法:所有 uv 命令都在含 pyproject.toml 的目录下执行。别依赖“应该能找得到”——它真不会猜。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










