uv install 默认只读取当前目录的pyproject.toml,不递归扫描子目录;若存在core/、api/等独立模块,需显式指定--path ./core --path ./api才能安装,否则import会报错。

uv install 为什么找不到 pyproject.toml 中的子模块
uv 默认只处理当前目录下的 pyproject.toml,不递归扫描子目录。如果你把多个模块(比如 core/、api/、cli/)各自放成独立包并写了各自的 pyproject.toml,直接在根目录运行 uv install 不会自动发现它们——它只认当前路径的配置。
常见错误现象:执行 uv install 后,import core 报 ModuleNotFoundError,但 core/pyproject.toml 明明存在且合法。
- 正确做法是用
--path显式指定每个模块路径,例如:uv install --path ./core --path ./api --path ./cli
- 如果模块间有依赖关系(如
api依赖core),需保证安装顺序或使用--no-deps控制依赖解析范围 - uv 不支持类似 pip-tools 的多文件 lock 管理,每个
--path对应独立解析,lock 文件也分开生成(默认为uv.lock,可用--locked强制校验)
怎么让 uv pip install -e 同时链接多个本地包
uv pip install -e 支持路径参数,但一次只能处理一个目标;想“同时”链接多个可编辑包,本质是多次调用 + 正确的安装上下文。
关键点在于:uv 的可编辑安装会写入当前 Python 环境的 site-packages 下的 .pth 或 direct_url.json,多次执行不会冲突,但要注意路径是否被重复解析。
- 推荐写成 shell 脚本批量执行:
uv pip install -e ./core<br>uv pip install -e ./api<br>uv pip install -e ./cli
- 不要用空格分隔多个路径(
uv pip install -e ./core ./api会报错:未知参数) - 若用
uv sync替代,需确保所有模块已通过--path注册进同一个 lock 文件,否则sync只装 lock 里记录的包 - Windows 上路径含空格时,必须用引号包裹每个
--path或-e参数
uv sync 和 uv install 在多模块场景下怎么选
uv install 是面向开发者的命令,用于从源码构建并安装包(支持 --path、--python、--system);uv sync 是面向部署的命令,严格按 uv.lock 复现环境。两者行为差异直接影响多模块协作流程。
- 日常开发用
uv install --path ./module_a --path ./module_b:快、支持热改、不强制锁文件 - CI/CD 或需要确定性环境时,先运行
uv lock --path ./module_a --path ./module_b生成统一uv.lock,再用uv sync安装 - 注意:
uv sync不接受--path,只读 lock;如果 lock 文件里没包含某个模块,sync就不会装它——哪怕该模块目录就在本地 - 模块版本冲突时,
uv lock会报错(如core==0.1.0和api==0.2.0都要求不同版本的requests),必须手动调整pyproject.toml中的requires-python或dependencies
为什么 uv run python -m mymodule 找不到自定义模块
这不是 uv 的问题,而是 Python 模块搜索路径(sys.path)没包含你的模块目录。uv 本身不修改 PYTHONPATH 或自动添加当前工作目录的子目录到路径中。
典型场景:项目结构为 ./src/mymodule/__init__.py,你在根目录执行 uv run python -m mymodule,报 No module named mymodule。
- 最稳妥的做法是先用
uv install -e ./src(假设src/pyproject.toml存在),让 uv 把src/注册为可编辑包 - 临时方案:加
--python-path参数,例如:uv run --python-path ./src python -m mymodule
- 避免用
cd src && uv run python -m mymodule:这会让相对导入、数据文件路径等出问题,尤其当模块内有__file__相关逻辑时 - 如果模块没有
pyproject.toml(纯目录结构),uv 无法识别为包,必须补上最小配置(至少含[build-system])才能被-e安装
实际用 uv 管理多模块项目,最难的不是命令怎么写,而是决定哪些模块该进 lock、哪些保持本地编辑、以及每次 uv lock 时要不要重新 include 所有 --path —— 这个决策一旦松动,不同成员的环境就容易漂移。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











