Python包管理不再头疼:uv工具快速上手

嚴華  金牌会员 | 2024-12-27 12:18:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 912|帖子 912|积分 2736

Python 包管理生态中存在多种工具,如 pip、pip-tools、poetry、conda 等,各自具备肯定功能。
而本日介绍的uv 是 Astral 公司推出的一款基于 Rust 编写的 Python 包管理工具,旨在成为 “Python 的 Cargo”。
它提供了快速、可靠且易用的包管理体验,在性能、兼容性和功能上都有出色体现,为 Python 项目的开发和管理带来了新的选择。
1. 为什么用uv

与其他Python中的包管理工具相比,uv更像是一个全能选手,它的上风在于:

  • 速度快:得益于Rust,uv工具的速度让人惊艳,比如安装依赖,速度比其他工具快很多
  • 功能全面:uv 是“一站式服务”的工具,从安装 Python、管理虚拟环境,到安装和管理包,再到管理项目依赖,它统统都能处理得很好
  • 前景光明:背后有风投公司Astral支持,且采用了MIT答应,纵然未来出现题目,社区也有应对的办法
使用uv,也可以像NodeJS或者Rust项目那样方便的管理依赖。
2. 如何安装

安装 uv 非常简单,可以使用官方提供的安装脚本,也可以通过pip来安装。
  1. # On macOS and Linux.
  2. curl -LsSf https://astral.sh/uv/install.sh | sh
  3. # On Windows.
  4. powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
  5. # With pip.
  6. pip install uv
复制代码
安装之后,可以通过uv help下令查抄是否安装成功:

3. 如何使用

下面演示如何使用uv来管理Python项目。
使用uv之前,创建一个Python项目对我来说就是创建一个文件夹而已。
使用uv之后,终于有了一些项目的感觉,对于uv,我使用时间也不长,疏漏或错误的地方欢迎指正!
接下来,从创建一个项目开始,演示我使用uv时常用的一些功能。
首先,介绍uv工具主要使用的两个文件:

  • pyproject.toml:定义项目的主要依赖,包括项目名称、版本、描述、支持的 Python 版本等信息
  • uv.lock:记录项目的全部依赖,包括依赖的依赖,且跨平台,确保在不同环境下安装的一致性。这个文件由 uv 主动管理,不要手动编辑
3.1. 创建项目

接下来,创建一个项目,使用uv init 下令。
  1. $  uv init myproject
  2. Initialized project `myproject` at `D:\projects\python\myproject`
  3. $  cd .\myproject\
  4. $  ls
  5.     目录: D:\projects\python\myproject
  6. Mode                 LastWriteTime         Length Name
  7. ----                 -------------         ------ ----
  8. -a----        2024/12/27  12:06:08            109 .gitignore
  9. -a----        2024/12/27  12:06:08              5 .python-version
  10. -a----        2024/12/27  12:06:08             87 hello.py
  11. -a----        2024/12/27  12:06:08            155 pyproject.toml
  12. -a----        2024/12/27  12:06:08              0 README.md
复制代码
通过init创建项目之后,uv工具知心地帮助我们天生了一些默认文件。
其中 hello.py 只是一段演示用的代码,
随后我们可以根据现实的项目需要删除这个代码文件,换成本身的现实代码。
  1. $  cat .\hello.py
  2. def main():
  3.     print("Hello from myproject!")
  4. if __name__ == "__main__":
  5.     main()
复制代码
pyproject.toml中是一些项目信息:
  1. $  cat .\pyproject.toml
  2. [project]
  3. name = "myproject"
  4. version = "0.1.0"
  5. description = "Add your description here"
  6. readme = "README.md"
  7. requires-python = ">=3.12"
  8. dependencies = []
复制代码
注意,uv init 创建项目之后,会主动将项目使用Git来管理。
3.2. 操作环境

创建项目之后,我们进入项目根文件夹的第一件事就是同步项目依赖。
  1. $  uv sync
  2. Using CPython 3.12.4 interpreter at: D:\miniconda3\envs\databook\python.exe
  3. Creating virtual environment at: .venv
  4. Resolved 1 package in 15ms
  5. Audited in 0.05ms
复制代码
同步之后,会主动查找或下载合适的 Python 版本,创建并设置项目的虚拟环境,构建完整的依赖列表并写入
uv.lock 文件,最后将依赖同步到虚拟环境中。
我们这个是新创建的项目,没有什么依赖,以是uv.lock 文件中的内容也比较简单。
  1. $  ls
  2.     目录: D:\projects\python\myproject
  3. Mode                 LastWriteTime         Length Name
  4. ----                 -------------         ------ ----
  5. d-----        2024/12/27  12:12:39                .venv
  6. -a----        2024/12/27  12:06:08            109 .gitignore
  7. -a----        2024/12/27  12:06:08              5 .python-version
  8. -a----        2024/12/27  12:06:08             87 hello.py
  9. -a----        2024/12/27  12:06:08            155 pyproject.toml
  10. -a----        2024/12/27  12:06:08              0 README.md
  11. -a----        2024/12/27  12:12:39            116 uv.lock
  12. $  cat .\uv.lock
  13. version = 1
  14. requires-python = ">=3.12"
  15. [[package]]
  16. name = "myproject"
  17. version = "0.1.0"
  18. source = { virtual = "." }
复制代码
uv sync同步之后,就可以运行项目的代码了。
既然使用uv管理项目的话,我们就使用uv的下令来运行代码,不要像从前那样使用python xxx.py来运行。
我们可以试着运行项目创建时主动天生的代码。
  1. $  uv run .\hello.py
  2. Hello from myproject!
复制代码
3.3. 管理依赖

管理依赖是我使用uv工具的主要目的,使用uv添加依赖非常简单,和npm和cargo差不多。
  1. $  uv add pandas
  2. Resolved 7 packages in 3.41s
  3. Prepared 6 packages in 4.63s
  4. Installed 6 packages in 1.80s
  5. + numpy==2.2.1
  6. + pandas==2.2.3
  7. + python-dateutil==2.9.0.post0
  8. + pytz==2024.2
  9. + six==1.17.0
  10. + tzdata==2024.2
复制代码
尝试安装了一个pandas依赖(pandas依赖的包也主动安装了),从上面日志可以看出速度非常快。
这时再看看uv.lock 文件的变化。
  1. $  cat .\uv.lock
  2. version = 1
  3. requires-python = ">=3.12"
  4. [[package]]
  5. name = "myproject"
  6. version = "0.1.0"
  7. source = { virtual = "." }
  8. dependencies = [
  9.     { name = "pandas" },
  10. ]
  11. [package.metadata]
  12. requires-dist = [{ name = "pandas", specifier = ">=2.2.3" }]
  13. [[package]]
  14. name = "pandas"
  15. version = "2.2.3"
  16. source = { registry = "https://pypi.org/simple" }
  17. dependencies = [
  18.     { name = "numpy" },
  19.     { name = "python-dateutil" },
  20.     { name = "pytz" },
  21.     { name = "tzdata" },
  22. ]
  23. [[package]]
  24. name = "pytz"
  25. version = "2024.2"
  26. source = { registry = "https://pypi.org/simple" }
复制代码
上面的日志中我删除了很多内容,由于整体内容太多,具体记录了每个包以及它依赖的包的情况。
uv.lock这个文件我们不要手动去编辑它,使用uv工具去管理它。
引入了pandas之后,我们看看是否可以在hello.py中使用。
  1. $  cat .\hello.pyimport pandas as pddef main():    print("Hello from myproject!")    df = pd.DataFrame(        {            "A": [1, 2, 3],            "B": [4, 5, 6],        }    )    print(df)if __name__ == "__main__":    main()$  uv run .\hello.py
  2. Hello from myproject!   A  B0  1  41  2  52  3  6
复制代码
可以正常使用安装的包pandas,下面在试试删除依赖会怎么样。
  1. $  uv remove pandas
  2. Resolved 1 package in 12ms
  3. Uninstalled 6 packages in 1.18s
  4. - numpy==2.2.1
  5. - pandas==2.2.3
  6. - python-dateutil==2.9.0.post0
  7. - pytz==2024.2
  8. - six==1.17.0
  9. - tzdata==2024.2
  10. $  cat .\uv.lock
  11. version = 1
  12. requires-python = ">=3.12"
  13. [[package]]
  14. name = "myproject"
  15. version = "0.1.0"
  16. source = { virtual = "." }
复制代码
使用uv remove下令删除pandas包之后,也会主动删除pandas依赖的其他包,
我们看到uv.lock 文件也规复到最初的内容。
再试试运行hello.py看看。
  1. $  uv run .\hello.py
  2. Traceback (most recent call last):
  3.   File "D:\projects\python\myproject\hello.py", line 1, in <module>
  4.     import pandas as pd
  5. ModuleNotFoundError: No module named 'pandas'
复制代码
果然,无法运行了。
3.4. 区分开发和生产环境

还有一个比较常用的功能是区分开发环境生产环境的依赖,这个功能在NodeJS和Rust中很常见。
比如,我们想把pandas安装到开发环境中,而把requests安装到生产环境中。
  1. $  uv add --group dev pandas
  2. Resolved 7 packages in 1.72s
  3. Installed 6 packages in 1.39s
  4. + numpy==2.2.1
  5. + pandas==2.2.3
  6. + python-dateutil==2.9.0.post0
  7. + pytz==2024.2
  8. + six==1.17.0
  9. + tzdata==2024.2
  10. $  uv add --group production requests
  11. Resolved 12 packages in 2.72s
  12. Prepared 5 packages in 1.31s
  13. Installed 5 packages in 68ms
  14. + certifi==2024.12.14
  15. + charset-normalizer==3.4.1
  16. + idna==3.10
  17. + requests==2.32.3
  18. + urllib3==2.3.0
复制代码
安装之后,uv.lock 文件主动添加了各个包及其依赖,这里不再赘述。
从项目的pyproject.toml中可以看出不同环境的包依赖。
  1. $  cat .\pyproject.toml
  2. [project]
  3. name = "myproject"
  4. version = "0.1.0"
  5. description = "Add your description here"
  6. readme = "README.md"
  7. requires-python = ">=3.12"
  8. dependencies = [][dependency-groups]dev = [    "pandas>=2.2.3",]production = [    "requests>=2.32.3",]
复制代码
4. 未来发展

uv 也可以构建和发布 Python 包到 PyPi,具体细节本篇就不睁开了。
uv 自从发布后,团队一直致力于优先提升其跨平台的兼容性、性能和稳固性,帮助用户顺利将项目过渡到使用uv来管理。
长远来看,uv 将发展成为一个完整的 Python 项目和包管理器,提供一站式的开发体验,涵盖从 Python 安装到项目管理的各个环节,进一步简化 Python 项目的开发流程,提高开发服从。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表