在项目中运行命令
当在项目中工作时,项目会被安装到 .venv 虚拟环境中。默认情况下,该环境与当前 shell 隔离,因此需要该项目的调用(例如 python -c "import example")将会失败。请改用 uv run 在项目环境中运行命令。
使用 run 时,uv 会确保项目环境在运行给定命令之前处于最新状态。
给定的命令可以由项目环境提供,也可以存在于环境之外,例如:
$ # Presuming the project provides `example-cli`
$ uv run example-cli foo
$ # Running a `bash` script that requires the project to be available
$ uv run bash scripts/foo.sh
请求额外依赖
可以在每次调用时请求额外的依赖项或不同版本的依赖项。
--with 选项用于在调用时包含依赖项,例如,请求不同版本的 httpx:
$ uv run --with httpx==0.26.0 python -c "import httpx; print(httpx.__version__)"
0.26.0
$ uv run --with httpx==0.25.0 python -c "import httpx; print(httpx.__version__)"
0.25.0
无论项目需求如何,请求的版本都将被遵循。例如,即使项目要求 httpx==0.24.0,上述输出也将是相同的。
运行脚本
声明内联元数据的脚本会自动在与项目隔离的环境中执行。有关详细信息,请参阅脚本指南。
例如,给定一个脚本:
# /// script
# dependencies = [
# "httpx",
# ]
# ///
import httpx
resp = httpx.get("https://peps.pythonlang.cn/api/peps.json")
data = resp.json()
print([(k, v["title"]) for k, v in data.items()][:10])
调用 uv run example.py 将在与项目隔离的状态下运行,且仅包含所列出的给定依赖项。
Windows 上的旧版脚本
uv 支持 旧版 setuptools 脚本。这些类型的脚本是 setuptools 安装在 .venv\Scripts 中的附加文件。
目前仅支持带有 .ps1、.cmd 和 .bat 扩展名的旧版脚本。
例如,下面是一个运行命令提示符脚本的示例。
此外,您不需要指定扩展名。uv 会自动代表您按 .ps1、.cmd 和 .bat 的顺序查找以这些扩展名结尾的文件。
信号处理
为了在失败时提供更好的错误消息,uv 不会将进程控制权交给生成的命令。因此,uv 负责将某些信号转发给运行所请求命令的子进程。
在 Unix 系统上,uv 会将大多数信号(SIGKILL、SIGCHLD、SIGIO 和 SIGPOLL 除外)转发给子进程。由于终端在按下 Ctrl-C 时会将 SIGINT 发送到前台进程组,因此 uv 仅在 SIGINT 被发送多次或子进程组与 uv 不同时,才会将其转发给子进程。
在 Windows 上,这些概念不适用,uv 会忽略 Ctrl-C 事件,将处理权留给子进程,以便其能够正常退出。