uv 是一款用 Rust 实现的广受欢迎的 Python 包管理工具。uv 的特色:
- 一个统一工具覆盖多个使用场景,可同时完成软件包安装、项目管理、虚拟环境管理等工作,替代或部分替代
pip、pipx、poetry、pyenv、virtualenv。 - 快到极致。不仅因为是 Rust 写的,也因为依赖解析算法(dependency resolution),比
pip快 10-100x。
安装与卸载
uv 提供了多种安装方式,既可以通过独立的安装器下载安装,也可以通过包管理器如 pypi、homebrew、cargo 等安装。
独立安装命令:
curl -LsSf https://astral.sh/uv/install.sh | sh
安装后得到 uv 和 uvx 两个命令。均安装在 ~/.local/bin 目录。独立安装的好处是,后续可以通过 uv self update 更新。
给 uv 和 uvx 设置命令行自动补全:
echo 'eval "$(uv generate-shell-completion zsh)"' >> ~/.zshrc
echo 'eval "$(uvx --generate-shell-completion zsh)"' >> ~/.zshrc
卸载
# 先清理
uv cache clean
rm -r "$(uv python dir)"
rm -r "$(uv tool dir)"
# 再删除
rm ~/.local/bin/uv ~/.local/bin/uvx
uv 功能概览
安装并管理 Python
uv python list
uv python install
uv python find
uv python pin
uv python uninstall
执行单独的 Python 脚本
uv run
uv add --script
uv remove --script
管理 Python 项目
uv init
uv add
uv remove
uv sync
uv lock
uv run
uv tree
uv build
uv publish
安装并运行 Python 工具(发布到 pypi 的包含可执行文件的包)
uvx
uvx tool run
uv tool install
uv tool uninstall
uv tool list
uv tool update-shell
兼容 pip 的功能,手动管理虚拟环境和包。
# 创建虚拟环境
uv venv
uv pip install
uv pip show
uv pip freeze
uv pip check
uv pip list
uv pip uninstall
uv pip tree
其他杂项
uv cache clean
uv cache prune
uv cache dir
uv tool dir
uv python dir
uv self update
安装 Python
如果系统已经安装了 Python,uv 可以检测到并直接使用已安装的版本,不需要额外配置。
uv 也可以安装并管理 Python 版本。
并且 uv 还会按需自动安装所需的 Python 版本。
# 查看已安装的 Python 版本
$ uv python list
cpython-3.15.0a7-macos-x86_64-none <download available>
cpython-3.15.0a7+freethreaded-macos-x86_64-none <download available>
cpython-3.14.3-macos-x86_64-none <download available>
cpython-3.14.3+freethreaded-macos-x86_64-none <download available>
cpython-3.13.12-macos-x86_64-none <download available>
cpython-3.13.12+freethreaded-macos-x86_64-none <download available>
cpython-3.12.13-macos-x86_64-none <download available>
cpython-3.11.15-macos-x86_64-none <download available>
cpython-3.10.20-macos-x86_64-none <download available>
cpython-3.9.25-macos-x86_64-none <download available>
cpython-3.9.6-macos-x86_64-none /usr/bin/python3
cpython-3.8.20-macos-x86_64-none <download available>
pypy-3.11.15-macos-x86_64-none <download available>
pypy-3.10.16-macos-x86_64-none <download available>
pypy-3.9.19-macos-x86_64-none <download available>
pypy-3.8.16-macos-x86_64-none <download available>
graalpy-3.12.0-macos-x86_64-none <download available>
graalpy-3.11.0-macos-x86_64-none <download available>
graalpy-3.10.0-macos-x86_64-none <download available>
graalpy-3.8.5-macos-x86_64-none <download available>
可见 uv 已探测到了 MacBook Pro 系统自带 Python,/usr/bin/python3,这是 2020 年发布的老旧版本。
# 安装 python。不指定版本的话,貌似是安装最新版。
$ uv python install
Installed Python 3.14.3 in 8.85s
+ cpython-3.14.3-macos-x86_64-none (python3.14)
# 再次查看已安装的 Python
# 增加了 cpython-3.14.3-macos-x86_64-none,且有两个路径。
# 一个是 .local/bin/python3.14,是个链接。
# 另一个是 .local/share/uv/python/cpython-3.14-macos-x86_64-none/bin/python3.14,这是真正安装的位置。
$ uv python list
cpython-3.15.0a7-macos-x86_64-none <download available>
cpython-3.15.0a7+freethreaded-macos-x86_64-none <download available>
cpython-3.14.3-macos-x86_64-none .local/bin/python3.14 -> .local/share/uv/python/cpython-3.14-macos-x86_64-none/bin/python3.14
cpython-3.14.3-macos-x86_64-none .local/share/uv/python/cpython-3.14-macos-x86_64-none/bin/python3.14
cpython-3.14.3+freethreaded-macos-x86_64-none <download available>
cpython-3.13.12-macos-x86_64-none <download available>
cpython-3.13.12+freethreaded-macos-x86_64-none <download available>
cpython-3.12.13-macos-x86_64-none <download available>
cpython-3.11.15-macos-x86_64-none <download available>
cpython-3.10.20-macos-x86_64-none <download available>
cpython-3.9.25-macos-x86_64-none <download available>
cpython-3.9.6-macos-x86_64-none /usr/bin/python3
cpython-3.8.20-macos-x86_64-none <download available>
pypy-3.11.15-macos-x86_64-none <download available>
pypy-3.10.16-macos-x86_64-none <download available>
pypy-3.9.19-macos-x86_64-none <download available>
pypy-3.8.16-macos-x86_64-none <download available>
graalpy-3.12.0-macos-x86_64-none <download available>
graalpy-3.11.0-macos-x86_64-none <download available>
graalpy-3.10.0-macos-x86_64-none <download available>
graalpy-3.8.5-macos-x86_64-none <download available>
~/.local/bin 已在我的 PATH 里面了,所以现在可以直接执行 python3.14 打开 Python 解释器。同时,python3 仍然为系统自带的 /usr/bin/python3,没有覆盖。
安装 Python 时可指定版本:
$ uv python install 3.15
Installed Python 3.15.0a7 in 8.69s
+ cpython-3.15.0a7-macos-x86_64-none (python3.15)
$ uv python list
cpython-3.15.0a7-macos-x86_64-none .local/bin/python3.15 -> .local/share/uv/python/cpython-3.15-macos-x86_64-none/bin/python3.15
cpython-3.15.0a7-macos-x86_64-none .local/share/uv/python/cpython-3.15-macos-x86_64-none/bin/python3.15
cpython-3.15.0a7+freethreaded-macos-x86_64-none <download available>
cpython-3.14.3-macos-x86_64-none .local/bin/python3.14 -> .local/share/uv/python/cpython-3.14-macos-x86_64-none/bin/python3.14
cpython-3.14.3-macos-x86_64-none .local/share/uv/python/cpython-3.14-macos-x86_64-none/bin/python3.14
cpython-3.14.3+freethreaded-macos-x86_64-none <download available>
cpython-3.13.12-macos-x86_64-none <download available>
cpython-3.13.12+freethreaded-macos-x86_64-none <download available>
cpython-3.12.13-macos-x86_64-none <download available>
cpython-3.11.15-macos-x86_64-none <download available>
cpython-3.10.20-macos-x86_64-none <download available>
cpython-3.9.25-macos-x86_64-none <download available>
cpython-3.9.6-macos-x86_64-none /usr/bin/python3
cpython-3.8.20-macos-x86_64-none <download available>
pypy-3.11.15-macos-x86_64-none <download available>
pypy-3.10.16-macos-x86_64-none <download available>
pypy-3.9.19-macos-x86_64-none <download available>
pypy-3.8.16-macos-x86_64-none <download available>
graalpy-3.12.0-macos-x86_64-none <download available>
graalpy-3.11.0-macos-x86_64-none <download available>
graalpy-3.10.0-macos-x86_64-none <download available>
graalpy-3.8.5-macos-x86_64-none <download available>
uv python list 展示的 Python 版本,除了官方的 cpython,还有 pypy 和 graalpy。当安装 Python 时,除了指定版本号,还可以直接使用 uv python list 输出的「全称」。
$ uv python install pypy-3.11.15-macos-x86_64-none
Installed Python 3.11.15 in 12.86s
+ pypy-3.11.15-macos-x86_64-none (pypy3.11)
执行 Python 脚本
可通过 uv run xxx.py 执行 Python 脚本。
如果 Python 脚本没有依赖,或者只依赖标准库,直接这样执行即可,非常简单。也可直接传入命令行参数。
$ uv run xxx.py
# hello 和 world 是命令行参数。
$ uv run xxx.py hello world
如果是在一个 Python 项目(里面有 pyproject.toml)执行 uv run,则将会在这个项目的环境里面运行,后面小节将会详细介绍这种情况,这一节只涉及单独的不属于任何项目的 Python 脚本。
但是,大部分时候,Python 脚本需要依赖其他包。这就需要一种机制,让脚本声明自己的依赖。我们的示例代码如下,文件名为 xxx.py。
import time
from rich.progress import track
for i in track(range(20), description="For example:"):
time.sleep(0.05)
xxx.py 依赖了 rich。直接执行 uv run xxx.py 会报错。
$ uv run xxx.py
Traceback (most recent call last):
File "/Users/yfaming/code/python/xxx.py", line 2, in <module>
from rich.progress import track
ModuleNotFoundError: No module named 'rich'
我们可以通过 --with 选项指定依赖。
uv run --with rich xxx.py
Installed 4 packages in 31ms
For example: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:01
如果有多个依赖包,则提供多个 --with 选项即可。
--with 也可以指定更具体的版本约束:
$ uv run --with 'rich>12,<13' xxx.py
Installed 3 packages in 15ms
For example: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
自声明依赖的 Python 脚本
每次都在命令行里声明依赖,非常不方便。uv 也支持在脚本文件里面声明依赖,这是通过 Python 的 inline script metadata 实现的。
# 初始化脚本,指定 Python 版本。
uv init --script xxx.py --python 3.12
此命令初始化脚本,并指定 Python 版本为 3.12。如果这个版本的 Python 未安装,uv 将会自动安装。得到的 xxx.py 内容如下:
# /// script
# requires-python = ">=3.12"
# dependencies = []
# ///
def main() -> None:
print("Hello from xxx.py!")
if __name__ == "__main__":
main()
接下来,给脚本添加依赖。
uv add --script xxx.py rich
此时 xxx.py 内容如下:
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "rich>=14.3.3",
# ]
# ///
def main() -> None:
print("Hello from xxx.py!")
if __name__ == "__main__":
main()
可以看到,dependencies 里面已经有 rich 了。
现在把 xxx.py 的代码加上,得到:
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "rich>=14.3.3",
# ]
# ///
import time
from rich.progress import track
for i in track(range(20), description="For example:"):
time.sleep(0.05)
然后执行脚本:
$ uv run xxx.py
For example: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:01
使脚本变成命令
如果脚本使用频率很高,那么通过 uv run xxx.py 执行仍然会觉得麻烦。
在脚本的第一行添加 shebang #!,就可以将这些细节隐藏起来。
#!/usr/bin/env -S uv run --script
#
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "rich>=14.3.3",
# ]
# ///
import time
from rich.progress import track
for i in track(range(20), description="For example:"):
time.sleep(0.05)
给脚本添加可执行权限,就可直接执行了。
$ chmod u+x xxx.py
$ ./xxx.py
For example: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:01
更进一步,去掉 xxx.py 的扩展名 .py,然后将它移动到 PATH 的某个目录里,xxx 就和其他命令毫无区别了。
# 我的机器的 `~/bin` 已在 PATH 里了。
$ mv xxx.py ~/bin/xxx
$ xxx
For example: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:01
通过这种方式开发 Python 命令行程序,实在太方便了!
uv tool
许多 Python 包不是 library 而是 application,它们提供了可执行命令。
uv 称这些可执行命令为 tool,可以方便地运行及安装 tool。
uvx - 无须安装直接运行 tool
uvx 可直接运行 tool,而不需要安装它。如:
$ uvx pycowsay hello world!
------------
< hello world! >
------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
uvx <command> 等价于 uv tool run <command>。单独提供 uvx 命令,是为了方便使用。
而且,如这个例子所示,使用 uvx 可以方便地传入命令行参数。在 tool 名字后面的参数,就是传入的参数。
运行 tool 时,可指定版本,格式为 command@<version>。如:
$ uvx ruff@0.3.0 check
# latest version
$ uvx ruff@latest check
运行 tool 时,还可指定 python 版本,使用 --python <version> 选项即可。如果这个版本的 Python 没有安装,uv 将会自动安装。
$ uvx --python 3.10 ruff
大部分时候,Python 包名和它提供的命令是同名的。但有时候却不然,比如 httpie 包提供了 http 命令行工具。
这种情况,可以用 --from 解决,形如:uvx --from <package> <command>。
$ uvx --from httpie http https://yfaming.com
... (output ignored)
tool 的显式安装和卸载
通过 uvx 运行 tool 时,uv 会创建一个临时的 Python 环境并缓存下来,在里面安装 tool 并运行。我们可以用 uv tool install <package> 显式地安装它。
$ uv tool install ipython
Resolved 16 packages in 451ms
Installed 16 packages in 129ms
+ asttokens==3.0.1
+ decorator==5.2.1
+ executing==2.2.1
+ ipython==9.12.0
+ ipython-pygments-lexers==1.1.1
+ jedi==0.19.2
+ matplotlib-inline==0.2.1
+ parso==0.8.6
+ pexpect==4.9.0
+ prompt-toolkit==3.0.52
+ ptyprocess==0.7.0
+ pure-eval==0.2.3
+ pygments==2.20.0
+ stack-data==0.6.3
+ traitlets==5.14.3
+ wcwidth==0.6.0
Installed 2 executables: ipython, ipython3
$ which ipython
/Users/yfaming/.local/bin/ipython
$ which ipython3
/Users/yfaming/.local/bin/ipython3
在我的 MacBook 上,ipython 命令入口是 ~/.local/bin/ipython。uv 在背后仍然会创建一个隔离的环境并安装它。~/.local/bin/ipython 只是个非常简单的入口而已。
注意,uv tool install <package> 指定的是 package,它会安装 package 里所有的 tool。这个例子中,ipython 包里的两个 tool ipython 和 ipython3 都安装了。
安装 tool 时可以指定版本号,如 uv tool install 'httpie>0.1.0'。
安装 tool 时,可以用 --python 参数指定使用的 Python 版本,如 uv tool install --python 3.11 ipython。如果这个版本的 Python 没有安装,uv 将会自动安装。
我们可以用 uv tool list 查看安装的 tool 列表。
$ uv tool list
ipython v9.12.0
- ipython
- ipython3
ruff v0.15.9
- ruff
可以看到已经安装了 ipython 和 ruff 两个 package 的 3 个 tool。
通过 uv tool upgrade 命令可升级安装的 tool 版本。
$ uv tool upgrade ruff
# 全部更新
$ uv tool upgrade --all
如果在安装 tool 时指定了版本限制,升级时将会尊重这个限制,不会无脑升级到最新版。比如如果安装命令为 uv tool install ruff >=0.3,<0.4,那么升级时只会升级到 >=0.3,<0.4 范围内的最新版。
uv tool uninstall <package> 用于卸载。
管理 Python 项目
初始化 Python 项目
uv init <project-name> 创建新项目。
$ uv init parq
Initialized project `parq` at `/Users/yfaming/code/python/parq`
它创建项目目录,并完成初始化。目录里包含以下文件:
├── .python-version
├── README.md
├── main.py
└── pyproject.toml
我们可以通过 uv run 执行项目的 main.py 文件:
$ cd parq
$ uv run main.py
Using CPython 3.14.3
Creating virtual environment at: .venv
Hello from parq!
首次运行时,uv 为项目创建虚拟环境,保存到项目根目录的 .venv 目录中。
如果执行 uv init 时不带 project-name,那么 uv 将当前目录初始化为一个项目。
uv init 如果传入 --lib 参数,将把项目作为一个库初始化,项目目录结构也有所不同。
$ uv init --lib parqlib
Initialized project `parqlib` at `/Users/yfaming/code/python/parqlib`
$ tree parqlib
parqlib
├── pyproject.toml
├── README.md
└── src
└── parqlib
├── __init__.py
└── py.typed
Python 项目结构
完整的项目结构是这样的(后续演示也以此为基础):
.
├── .venv
│ ├── bin
│ ├── lib
│ └── pyvenv.cfg
├── .python-version
├── parq
│ ├── __init__.py
│ ├── config.py
│ └── main.py
├── README.md
├── pyproject.toml
└── uv.lock
pyproject.toml 包含项目的元信息。项目的依赖包就在这个文件中声明,项目的细节信息如项目名称、描述等信息也在这里。pyproject.toml 已被标准化,可见此处。它是 TOML 格式的,一般包括 [build-system]、[project]、[tool] 3 个 table。
一个示例 pyproject.toml 内容如下:
[project]
name = "parq"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.14"
dependencies = [
"requests>=2.33.1",
]
[project.scripts]
parq = "parq.main:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
# 不同的 build-system 对于目录结构似乎有要求。
# 如果使用 uv_build,则要求 Python 代码放到 src/parq 里面。
# [build-system]
# requires = ["uv_build>=0.11.3,<0.12.0"]
# build-backend = "uv_build"
[project.scripts] 指定了项目的可执行入口,因此这个项目同时也可以是 uv tool 了。
.python-version 文件声明了项目需要的 Python 版本。uv 创建虚拟环境时需要用到。
.venv 目录,包含项目虚拟环境。
uv.lock,类似 Cargo.lock,略。
管理项目依赖
# 添加依赖
$ uv add requests
# 指定版本
$ uv add 'requests==2.31.0'
# 从 git 仓库添加依赖
$ uv add git+https://github.com/psf/requests
# 删除依赖
$ uv remove requests
在 Python 项目里面执行命令
前面提到的 uv run 也可用于在项目里面执行命令。执行 uv run 时,uv 会更新 uv.lock,安装依赖,并在项目当前环境中执行命令。
运行项目某个模块
$ uv run python -m parq.main
在项目环境下启动 Python 解释器,执行 parq.main 模块。这相当于激活虚拟环境后,再执行 python -m parq.main。
运行项目入口程序
如果 pyproject.toml 中声明了 [project.scripts] 且声明了 [build-system],则可通过 uv run <entry_script> 运行。此时 uv 将先 build 项目,并将项目入口脚本安装到项目的 Python 环境中,然后执行入口脚本。
pyproject.toml 有关内容如下:
[project.scripts]
parq = "parq.main:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
# 不同的 build-system 对于目录结构似乎有要求。
# 如果使用 uv_build,则要求 Python 代码放到 src/parq 里面。
# [build-system]
# requires = ["uv_build>=0.11.3,<0.12.0"]
# build-backend = "uv_build"
用 uv run 运行项目入口程序:
$ uv run parq hello
Hello from parq!
argv: ['/Users/yfaming/code/python/parq/.venv/bin/parq', 'hello']
config:
app_name = parq
version = 0.1.0
如果 pyproject.toml 中只声明了 [project.scripts] 但没有声明 [build-system],则 uv 不会 build 项目并安装,从而导致报错找不到命令。
从 stdin 读取 Python 代码并执行
uv run - 将从 stdin 读取 Python 代码并执行。
$ uv run -
# 以下为输入的代码,完成后按 Ctrl-D 完成输入
from parq.main import main
main()
# 以下为代码的输出
Hello from parq!
argv: ['-c']
config:
app_name = parq
version = 0.1.0
运行项目依赖包提供的命令
$ uv add --dev ruff ipython
$ uv run ruff check
All checks passed!
$ uv run ipython
Python 3.14.3 (main, Mar 25 2026, 03:01:30) [Clang 22.1.1 ]
Type 'copyright', 'credits' or 'license' for more information
IPython 9.12.0 -- An enhanced Interactive Python. Type '?' for help.
Tip: Use `%timeit` or `%%timeit`, and the `-r`, `-n`, and `-o` options to easily profile your code.
In [1]: import requests
这里 uv 安装了 ruff 和 ipython 并运行它们。
值得一提的是 uv run 查找命令的过程。uv run 运行时,会先安装项目依赖,并在项目环境中执行命令。意味着,它找到的 ruff 和 ipython 是当前项目安装的版本,使用的是当前项目的 Python 解释器,并且可以 import 当前项目的依赖包。
通过 uv run ipython 运行 IPython 时,由于 requests 是项目的依赖包,uv 已经为我们安装好了,因此我们输入 import requests 时一切正常。
而如果我们直接通过 ipython 命令运行 IPython,此时运行的将是之前在系统环境中安装的 IPython。而系统环境中没有安装过 requests 包,所以此时输入 import requests 会报错。
$ ipython
Python 3.14.3 (main, Mar 25 2026, 03:01:30) [Clang 22.1.1 ]
Type 'copyright', 'credits' or 'license' for more information
IPython 9.12.0 -- An enhanced Interactive Python. Type '?' for help.
Tip: Use `ipython --help-all | less` to view all the IPython configuration options.
In [1]: import requests
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[1], line 1
----> 1 import requests
ModuleNotFoundError: No module named 'requests'
其他
其他情况,uv 则在整个系统中查找命令并执行。
uv run 的逻辑总结
从使用效果上,uv run 可以理解为在选定的 Python 环境中运行命令,它需要搞定 Python 环境,查找命令,并执行。
前面小节提到的用 uv run 执行 Python 脚本,查找命令的方式仍然相同。只是,如果 uv 发现 Python 脚本里包含 inline script metadata,则 uv 将会创建一个隔离的、临时的环境,在里面安装依赖,并执行。
uv run 的逻辑,推测可能是这样的:
- 查找 Python 环境
- 如果处在 Python 项目中,则激活当前 Python 环境。
PATH和 Python 解释器(及 Python 解释器能访问的包)都会发生变化。- 如果
pyproject.toml中声明了[project.scripts]且声明了[build-system],则 uv 会确保当前项目已安装到当前 Python 环境中。
- 如果
- 否则,使用系统的 Python 环境。
- 如果处在 Python 项目中,则激活当前 Python 环境。
- 查找需要执行的命令(或 Python 脚本)
- 从
PATH中查找。- 注意,如果处在 Python 项目中,
PATH会发生变化,因此可以查到项目依赖包提供的命令,以及项目的入口命令。
- 注意,如果处在 Python 项目中,
- 从
- 执行
- 如果非 Python 脚本,直接执行。
- 如果是 Python 脚本,或者需要从 stdin 中读取 Python 代码并执行。
- 如果脚本里面包含 inline script metadata,则创建一个隔离的、临时的 Python 并在里面执行
- 否则,使用第一步查找到的 Python 环境,并执行。
构建项目
uv build 构建项目,它为项目生成 source distribution 和 binary distribution,保存到 dist/ 目录。
$ uv build
Building source distribution...
Building wheel from source distribution...
Successfully built dist/parq-0.1.0.tar.gz
Successfully built dist/parq-0.1.0-py3-none-any.whl
如果项目在 pyproject.toml 的 [project.scripts] 中声明了可执行入口(不论是否同时声明了 [build-system]),我们可以通过 uv tool install . 安装为 tool。
$ uv tool install .
Resolved 6 packages in 24ms
Installed 6 packages in 9ms
+ certifi==2026.2.25
+ charset-normalizer==3.4.7
+ idna==3.11
+ parq==0.1.0 (from file:///Users/yfaming/code/python/parq)
+ requests==2.33.1
+ urllib3==2.6.3
Installed 1 executable: parq
$ uv tool list
uv tool list
ipython v9.12.0
- ipython
- ipython3
parq v0.1.0
- parq
我们也可以通过 build 出来的 distribution 来安装 tool。
$ uv tool install dist/parq-0.1.0-py3-none-any.whl
Resolved 6 packages in 7ms
Installed 6 packages in 10ms
+ certifi==2026.2.25
+ charset-normalizer==3.4.7
+ idna==3.11
+ parq==0.1.0 (from file:///Users/yfaming/code/python/parq/dist/parq-0.1.0-py3-none-any.whl)
+ requests==2.33.1
+ urllib3==2.6.3
Installed 1 executable: parq