当前位置: 首页 > ai >正文

【Python】UV:单脚本依赖管理

一、基础概念

  1. 什么是 Python 脚本

    • .py 结尾的文件,可通过 python script.py 独立执行。
    • UV 工具优势:无需手动创建或激活虚拟环境,自动为每个脚本生成隔离环境,保证依赖互不干扰。
  2. 环境管理原理

    graph LRA[系统 Python 环境] --> B[虚拟环境隔离]B --> C[UV 自动创建临时环境]
    
    • 当执行 uv run 时,UV 会自动在后台生成一个临时虚拟环境,仅安装当前脚本所需的依赖,脚本执行完毕后可复用或销毁该环境。

提示:如果不熟悉虚拟环境,可参考 Python 自带的 venv 模块。uv 会在后台帮你管理环境,并且推荐“声明式”地在脚本里写明依赖。

学习建议

  1. 从无依赖脚本起步,熟悉 uv run 基本用法;
  2. 再尝试临时依赖模式,理解 --with
  3. 最终过渡到内联依赖,编写更稳定、可复现的脚本。
    遇到问题时,uv run --verbose 脚本.py 可查看详细执行日志,帮助排查。

二、基础使用

1. 无依赖脚本

# hello.py
print("你好,世界!")
$ uv run hello.py
你好,世界!

无额外依赖时,直接运行即可。

2. 带命令行参数

# greet.py
import sys
print(" ".join(sys.argv[1:]))
$ uv run greet.py 你好 Python
你好 Python

命令行参数会按顺序传入脚本,sys.argv[1:] 即所有参数列表。

3. 从标准输入读取

$ echo 'print("stdin 运行!")' | uv run -
stdin 运行!

或使用 here-doc:

$ uv run - <<EOF
print("多行脚本测试")
EOF
多行脚本测试

项目模式
如果当前目录包含 pyproject.tomluv run 会默认安装项目依赖。
如只想运行脚本并忽略项目本身,需在命令前加 --no-project

uv run --no-project hello.py

三、依赖管理

1. 临时依赖(单次运行)

适合偶尔需要外部库,但不想在脚本里永久添加依赖的场景。

# progress.py
from rich.progress import track
for _ in track(range(10), description="加载中"):pass
$ uv run --with rich progress.py
加载中 ━━━━━━━━━━━━━━ 100% 0:00:00
  • --with rich:当前执行临时安装并使用 rich 库。
  • 可多次使用 --with 添加多个包。

2. 永久依赖(内联声明)

推荐做法,在脚本顶部声明依赖,UV 会自动识别并安装。

# /// script
# dependencies = ["requests", "rich"]
# ///import requests
from rich import printresp = requests.get("https://api.example.com")
print(resp.status_code, resp.text)

管理命令:

$ uv add --script demo.py requests rich
  • 该命令会在脚本头部生成或更新 dependencies 列表。
  • 后续直接 uv run demo.py 即可,无需再加 --with

注意:使用内联依赖时,若在项目目录下运行,也不会安装项目依赖,脚本只关心自己声明的包。


四、相关管理命令

功能场景命令示例说明
指定 Python 版本uv run --python 3.10 demo.py若本地无该版本,UV 会自动下载并使用
锁定依赖版本uv lock --script demo.py生成 demo.py.lock,用于可重复运行
导出依赖清单uv export --script demo.py输出 requirements.txt 或等效格式,方便分享
查看依赖树uv tree --script demo.py以树状结构展示当前脚本依赖及其互相引用
移除脚本依赖uv remove --script demo.py package_name从内联声明中删除指定包
清理环境uv clean demo.py删除该脚本对应的虚拟环境,以便重新创建
使用私有源uv add --index https://私有源/simple --script demo.py 包名将私有索引写入脚本元数据,支持认证
导出锁文件uv export --lock demo.py.lock将锁文件内容导出为可阅读格式
查看脚本信息uv info --script demo.py显示已声明依赖、Python 版本需求、索引源等元数据信息
项目依赖安装(全局)uv install在项目目录安装 pyproject.toml 中定义的所有依赖
版本升级uv upgrade [package]升级指定包或全部包到最新版本
环境诊断uv doctor检查 UV 配置和环境问题,给出修复建议

五、最佳实践

  1. 创建可执行脚本(类 Unix 系统)
    在脚本顶部添加 shebang,可直接双击或命令行执行,无需写命令。

    #!/usr/bin/env -S uv run --script
    print("脚本可执行!")
    

    授予执行权限:

    chmod +x script
    ./script
    
  2. 跨平台 GUI 开发

    • Windows 下使用 .pyw 扩展,UV 会用 pythonw 运行,无控制台窗口。
    • 同样支持依赖管理:
    # app.pyw
    from tkinter import Tk, Label
    root = Tk()
    Label(root, text="UV GUI 示例").pack()
    root.mainloop()
    
    uv run --with PyQt5 app.pyw
    

六、常见问题

Q1:为何出现 ModuleNotFoundError
A:说明脚本缺少依赖声明,可用

uv add --script 脚本.py 包名

或在执行时临时加 --with 包名

Q2:如何保证他人环境也能正常运行?
A:使用锁定命令:

uv lock --script 脚本.py

生成 .lock 文件后,可与他人一同分享,确保安装相同版本的依赖。

http://www.xdnf.cn/news/5510.html

相关文章:

  • DVWA在线靶场-SQL注入部分
  • The Graph:区块链数据索引的技术架构与创新实践
  • maitrix-org/Voila-chat:端到端音频聊天模型
  • 如何判断IP是否被平台标记
  • 深入解读tcpdump:原理、数据结构与操作手册
  • YAFFS2 的 `yaffs_obj` 数据结构详解
  • JAVA EE_网络原理_数据链路层
  • R语言实战第5章(1)
  • 软考错题(四)
  • 小结:Syslog
  • 运用数组和矩阵对数据进行存取和运算——NumPy模块 之五
  • vue3+three 搭建平面上滚动旋转的几何体
  • 【深度学习】计算机视觉(18)——从应用到设计
  • 数据库笔记(1)
  • DeepWiki: Github的百科全书
  • vue实现与后台springboot传递数据【传值/取值 Axios 】
  • 基于大模型的甲状腺结节诊疗全流程预测与方案研究报告
  • C++ 状态模式详解
  • (网络)应用层协议-HTTPS
  • .NET 8 API 实现websocket,并在前端angular实现调用
  • WSL 安装 Debian 12 后,Linux 如何安装 redis ?
  • 如何翻译英文文献
  • 后端开发面试高频50个问题,简单解答
  • 企业对数据集成工具的需求及 ETL 工具工作原理详解
  • 【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)
  • python shutil 指定文件夹打包文件为 zip 压缩包
  • 配置Hadoop集群-集群配置
  • 木马查杀引擎—关键流程图
  • Excel使用VBA批量计算指定列的中位数和标准差并筛选指定列数据
  • 【现代深度学习技术】注意力机制05:多头注意力