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

uv run 都做了什么?

  1. uv run 都做了什么?

    • uv run <命令> [参数...] 的主要作用是:在一个由 uv 管理或发现的 Python 虚拟环境中,执行你指定的 <命令>
    • 它会临时配置一个子进程的环境,使其表现得如同该虚拟环境已经被激活一样。这意味着:
      • 如果你运行的命令是 python 或依赖于 python,它会使用虚拟环境中的 Python 解释器
      • 任何安装在虚拟环境 Scripts (Windows) 或 bin (Linux/macOS) 目录下的可执行脚本(比如 pytest, flask, black 等)都可以直接通过名字调用。
      • 被执行的 Python 代码可以访问到安装在该虚拟环境中的所有包。
    • 这样做的好处是,你无需先手动激活 (source .venv/bin/activate.venv\Scripts\activate.bat) 虚拟环境,就能运行与该环境相关的命令。这在自动化脚本(如 CI/CD)或执行单个项目特定的命令时非常方便。
  2. 本质是什么?

    • uv run 的本质是为单个命令提供临时的、隔离的 Python 环境上下文注入。它模拟了环境激活的效果,但仅限于它所启动的那个子进程,并且不会改变你当前 Shell 的永久状态。
  3. 这个 uv 是哪个 uv?是 exe 吗?

    • 是的。这里的 uv 指的是由 Astral 公司开发的那个 uv 可执行程序(在 Windows 上通常是 uv.exe,在 Linux/macOS 上是 uv)。
    • run 是这个 uv 程序的一个子命令,就像 uv pip installuv venv 一样。
  4. 这个 uv 可以使用绝对路径吗?

    • 可以。和绝大多数命令行程序一样,你可以通过提供完整的绝对路径来调用 uv 可执行文件,例如:
      • Windows: C:\path\to\your\uv.exe run python --version
      • Linux/macOS: /path/to/your/uv run python --version
    • 如果 uv 所在的目录没有被添加到系统的 PATH 环境变量中,你就必须使用绝对路径或相对路径来运行它。
  5. uv run 本质还是用 Python 执行吗?

    • 不完全是,要区分开来看
      • uv run 命令本身: uv run 这个命令的执行逻辑(解析参数、发现环境、设置子进程环境、启动子进程)是由 uv 可执行文件处理的,而 uv 是用 Rust 语言编写的。所以,uv run 的准备和启动阶段不是用 Python 执行的
      • uv run 运行的 <命令>: uv run 后面你指定的那个 <命令> 通常会涉及 Python。例如:
        • uv run python myscript.py: uv (Rust) 启动了环境中的 python 解释器 (C 或其他语言实现) 来执行 myscript.py (Python 代码)。
        • uv run pytest: uv (Rust) 启动了环境中的 pytest 命令(通常是一个 Python 脚本的入口点)。
        • uv run echo "Hello": uv (Rust) 启动了 Shell 的 echo 命令(通常是内置或系统命令,不是 Python)。
    • 总结: uv run 本身是 Rust 程序的一部分,但它使你能够方便地在正确的 Python 环境下运行通常需要 Python 或其相关工具的命令
  6. uv run 可以指定使用哪个环境的 Python 吗?

    • 通常是间接指定的,通过环境发现机制uv run 需要知道在哪个环境中运行命令。它确定环境的方式通常是:
      • 自动发现: uv 会检查当前工作目录及父目录,寻找虚拟环境的标记。最常见的是查找名为 .venv 的目录(这是 uv venv 默认创建的环境名,也是 PEP 推荐的名称)。它也可能检查 pyproject.toml 文件来确定项目根目录,并在那里寻找虚拟环境。
      • 激活的环境: 如果当前 Shell 中已经有一个虚拟环境被激活,uv 通常会优先使用这个已激活的环境。
    • 直接指定 (不太常见/可能需查阅文档): uv 的设计倾向于自动发现。虽然某些工具允许使用 --prefix 或类似参数直接指定环境路径,但这似乎不是 uv run 当前(截至 2024 年初/中期)主要的或推荐的使用方式。它的设计理念更偏向于在项目内自动找到对应的 .venv
    • 结论: 你通常不直接给 uv run 传递一个 Python 解释器的路径。而是确保你的命令行位于项目目录下(或者项目内某个子目录),并且项目根目录下有一个 uv 能识别的虚拟环境(比如 .venv),uv run 会自动找到并使用该环境中的 Python。如果 uv 无法找到合适的环境,命令可能会失败。

第一:详细步骤讲解 uv run python myscript.py

  1. 输入命令: 你在命令行终端输入 uv run python myscript.py 并按下回车。
  2. Shell 调用 uv: 你的命令行 Shell(如 Bash, Zsh, CMD, PowerShell)根据系统的 PATH 环境变量找到 uv 这个可执行程序(或者你直接使用了绝对路径 C:\path\to\uv.exe)。Shell 启动 uv 程序。
  3. uv 解析参数: uv 程序(用 Rust 编写)开始执行。它首先解析你给它的命令行参数:run, python, myscript.py。它识别出 run 是它需要执行的一个子命令。
  4. 环境发现 (关键步骤): uvrun 子命令逻辑开始工作。它的首要任务是确定要在哪个 Python 虚拟环境中运行后续命令 (python myscript.py)。它会按一定策略查找:
    • 检查激活环境: 它可能会检查当前 Shell 是否已经激活了某个虚拟环境(通过检查 VIRTUAL_ENV 环境变量)。
    • 查找 .venv: 它会从当前工作目录开始,向上查找名为 .venv 的文件夹(这是 uv venv 默认创建的环境名,也是常用的约定)。
    • 查找 pyproject.toml: 它可能查找 pyproject.toml 文件来确定项目根目录,然后在项目根目录下寻找 .venv
    • 我们假设 uv 成功找到了一个虚拟环境,比如在当前目录下的 .venv 文件夹。
  5. 获取环境路径: uv 确定了目标虚拟环境的路径(例如 ./.venv)。
  6. 准备子进程环境: uv 现在准备启动一个新的子进程来执行 python myscript.py。在启动前,它会为这个子进程准备一套临时的环境变量,这些变量是对当前 Shell 环境变量的修改:
    • 修改 PATH: 它会将找到的虚拟环境的脚本目录(如 ./.venv/Scripts on Windows 或 ./.venv/bin on Linux/macOS)添加到 PATH 环境变量的最前面
    • 设置 VIRTUAL_ENV: 它会设置 VIRTUAL_ENV 环境变量,指向虚拟环境的根目录路径(如 ./.venv)。
    • 其他相关变量也可能被设置。
  7. 启动子进程: uv 使用准备好的、包含修改后环境变量的配置,启动一个新的操作系统进程,让这个进程执行命令 python myscript.py
  8. 子进程执行 python: 在这个新启动的子进程中,操作系统根据其(被 uv 修改过的)PATH 变量查找 python 可执行文件。由于虚拟环境的脚本目录被放在了 PATH 的最前面,操作系统会找到并执行位于 ./.venv/Scripts/python.exe (或 ./.venv/bin/python) 的那个 Python 解释器。
  9. Python 解释器执行脚本: 虚拟环境中的 Python 解释器启动后,接收到参数 myscript.py。它开始读取并执行 myscript.py 这个 Python 脚本文件。
  10. 脚本访问包: 在 myscript.py 内部,如果有 import some_package 这样的语句,Python 解释器会查找其自身的 site-packages 目录(位于 ./.venv/lib/pythonX.Y/site-packages)。由于 uv run 确保了使用的是虚拟环境的解释器,因此脚本可以成功导入所有已安装到这个 .venv 环境中的包。
  11. 脚本执行完毕: myscript.py 执行完成。
  12. 子进程退出: Python 解释器退出,步骤 7 中启动的那个子进程随之终止。
  13. uv 进程退出: uv 主进程(步骤 3 启动的)完成了 run 命令的任务,也退出。
  14. 返回 Shell: 控制权交还给你的命令行 Shell。重要的是,你原始 Shell 的环境变量(如 PATH)没有被改变uv run 的效果仅限于它启动的那个子进程。

第二:uv run 是新建了一个环境吗?还是调用了环境?调用的是已有的 Python 环境吗?

  • uv run 调用(或 使用)一个已有的 Python 环境
  • 不会为执行 run 命令而动态地创建一个全新的环境。
  • 它的核心功能之一就是发现与当前项目或目录相关联的那个已经存在的虚拟环境。这个环境通常是你之前通过 uv venv .venvpython -m venv .venv 等命令创建好的。

第三:这个 Python 部分可以使用指定的 Python 吗?

  • 不能直接通过参数告诉 uv run 使用任意路径的 Python 解释器。
  • uv run 使用哪个 Python 解释器,取决于它发现了哪个虚拟环境。它会使用那个被发现的虚拟环境内部自带的 Python 解释器。
  • 所以,如果你想让 uv run 使用特定版本的 Python(比如 Python 3.10),你需要确保它发现的那个虚拟环境是用 Python 3.10 创建的。例如,你在创建环境时就这样做:uv venv .venv --python 3.10 (如果 uv 支持这种指定) 或者 python3.10 -m venv .venv
  • 控制方式是间接的:控制 uv run 找到哪个环境,从而决定了它使用哪个 Python。

第四:怎么知道是哪个包?uv 本身存包了吗?

  • uv run 如何知道包?
    • uv run 本身不直接“知道”包。它只负责启动正确的 Python 解释器(属于被发现的虚拟环境的那个)。
    • 那个 Python 解释器知道去哪里查找包。Python 解释器在启动时,会自动知道其对应的 site-packages 目录的位置(例如 .venv/lib/pythonX.Y/site-packages)。
    • 当你的 myscript.py 执行 import some_package 时,是 Python 解释器在自己的 site-packages 目录里查找 some_package
    • 所以,uv run 确保了你的脚本由正确的解释器运行,而这个解释器负责在其自己的地盘 (site-packages) 里找包。包必须是预先通过 uv pip installpip install 安装到这个环境里的。
  • uv 本身存包了吗?
    • uv 维护一个全局的包缓存(通常在你的用户主目录下的某个隐藏文件夹里,比如 ~/.cache/uv)。当你使用 uv pip install 安装包时,uv 会先把包(通常是 .whl 文件)下载到这个全局缓存中。然后,它会从缓存中将包解压并安装到你指定的或当前活动的虚拟环境的 site-packages 目录里。
    • 这个缓存是为了加速后续安装。如果下次你在另一个项目需要安装同一个包的同一个版本,uv 可以直接从缓存中获取,而无需重新下载。
    • 但是,uv run 命令本身在执行时,并不直接依赖或操作这个全局缓存。它依赖的是目标虚拟环境 site-packages 目录中实际安装好的包。缓存是 uv pip install 等安装命令使用的。

第五:uv run 的 py 文件和直接使用 python 运行的有什么区别?

这是关键的区别,主要在于执行上下文(哪个 Python 解释器和哪些可用的包)的确定性

  • python myscript.py (直接运行)

    • 依赖当前 Shell 状态:它使用的是 Shell 当前 PATH 环境变量中找到的第一个 python 可执行文件。
    • 如果环境已激活: 假设你先手动运行了 source .venv/bin/activate,那么 PATH 会指向 .venv 里的 python,这时 python myscript.py 会使用虚拟环境的解释器和包,效果与 uv run python myscript.py 相同。
    • 如果环境未激活: PATH 会指向系统的全局 Python (或其他非项目环境的 Python)。脚本会用这个全局 Python 执行,并且只能访问全局安装的包。如果 myscript.py 依赖于只安装在 .venv 中的包,它会因为 ModuleNotFoundError 而失败。
    • 易出错: 这种方式依赖于你是否记得激活了正确的环境,容易出错。
  • uv run python myscript.py

    • 不依赖当前 Shell 激活状态: 它会主动去发现项目关联的虚拟环境(通常是 .venv)。
    • 保证使用环境内的 Python: 它确保启动的 python 是被发现的虚拟环境内部的那个解释器。
    • 保证访问环境内的包: 因此,脚本运行时总能访问到安装在那个特定虚拟环境中的所有包。
    • 更可靠: 这种方式更可靠,因为它不依赖于你当前 Shell 是否激活了环境,直接将命令绑定到目标环境上执行。特别适用于自动化脚本和避免忘记激活环境的场景。

总结来说: uv run 提供了一种无需手动激活环境就能可靠地在指定项目虚拟环境上下文中运行命令(包括执行 Python 脚本)的方法。而直接运行 python 则完全依赖于当前 Shell 的环境状态。

相关文章:

uv run 都做了什么?

uv run 都做了什么&#xff1f; uv run <命令> [参数...] 的主要作用是&#xff1a;在一个由 uv 管理或发现的 Python 虚拟环境中&#xff0c;执行你指定的 <命令>。它会临时配置一个子进程的环境&#xff0c;使其表现得如同该虚拟环境已经被激活一样。这意味着&am…...

求解,如何控制三相无刷电机?欢迎到访评论

问题&#xff1a;通过一个集成的TF2104芯片控制H桥上桥臂和下桥臂&#xff0c;如何控制&#xff1f;还是说得需要PWM_UH和PWM_UL分开控制&#xff1f;...

Java ThreadLocal与内存泄漏

当我们利用 ThreadLocal 来管理数据时&#xff0c;我们不可避免地会面临内存泄漏的风险。 原因在于 ThreadLocal 的工作方式。当我们在当前线程的 ThreadLocalMap 中存储一个值时&#xff0c;一旦这个值不再需要&#xff0c;释放它就变得至关重要。如果不这样做&#xff0c;那么…...

365打卡第R3周: RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.10 编译器&#xff1a;Jupyter Lab 深度学习环境&#xff1a;torch2.5.1 torchvision0…...

1.1.1 用于排序规则的IComparable接口使用介绍

在C#中&#xff0c;IComparable 是一个核心接口&#xff0c;用于定义对象的自然排序规则。实现该接口的类可以指定其实例如何与其他实例比较大小&#xff0c;从而支持排序操作&#xff08;如 Array.Sort()、List.Sort()&#xff09;. 1. 该接口CompareTo返回值含义&#xff1a;…...

【实战】基于强化学习的 Agent 训练框架全流程拆解

一、引言 在人工智能蓬勃发展的今天&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;作为让智能体&#xff08;Agent&#xff09;在复杂环境中自主学习并做出最优决策的核心技术&#xff0c;正日益受到关注。从游戏领域中击败人类顶尖选手的 AlphaGo&a…...

【音视频】⾳频处理基本概念及⾳频重采样

一、重采样 1.1 什么是重采样 所谓的重采样&#xff0c;就是改变⾳频的采样率、sample format、声道数等参数&#xff0c;使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样? 当然是原有的⾳频参数不满⾜我们的需求&#xff0c;⽐如在FFmpeg解码⾳频的时候…...

Prompt 结构化提示工程

Prompt 结构化提示工程 目前ai开发工具都大同小异&#xff0c;随着deepseek的流行&#xff0c;ai工具的能力都差不太多&#xff0c;功能基本都覆盖到了。而prompt能力反而是需要更加关注的&#xff08;说白了就是能不能把需求清晰的输出成文档&#xff09;。因此大家可能需要加…...

设计心得——数据结构的意义

一、数据结构 在老一些的程序员中&#xff0c;可能都听说过&#xff0c;程序其实就是数据结构算法这种说法。它是由尼克劳斯维特在其著作《算法数据结构程序》中提出的&#xff0c;然后在一段时期内这种说法非常流行。这里不谈论其是否正确&#xff0c;只是通过这种提法&#…...

【Pandas】pandas DataFrame rdiv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

Pycharm 代理配置

Pycharm 代理配置 文章目录 Pycharm 代理配置1. 设置系统代理1.1 作用范围1.2 使用场景1.3 设置步骤 2. 设置 python 运行/调试代理2.1 作用范围2.2 使用场景2.3 设置步骤 Pycharm 工具作为一款强大的 IDE&#xff0c;其代理配置在实际开发中也是必不可少的&#xff0c;下面介绍…...

GPU 加速库(CUDA/cuDNN)

现代数字图像处理与深度学习任务对计算效率提出极高要求&#xff0c;GPU 加速库通过硬件并行计算能力大幅提升数据处理速度。 一、CUDA 并行计算架构深度解析 1. 架构设计与硬件协同 CPU-GPU 异构计算模型CPU 作为主机端&#xff0c;主要负责逻辑控制、任务调度以及数据预处…...

Spring Native:GraalVM原生镜像编译与性能优化

文章目录 引言一、Spring Native与GraalVM基础1.1 GraalVM原理与优势1.2 Spring Native架构设计 二、原生镜像编译实践2.1 构建配置与过程2.2 常见问题与解决方案 三、性能优化技巧3.1 内存占用优化3.2 启动时间优化3.3 实践案例分析 总结 引言 微服务架构的普及推动了轻量级、…...

JAVA JVM面试题

你的项目中遇到什么问题需要jvm调优&#xff0c;怎么调优的&#xff0c;堆的最小值和最大值设置为什么不设置成一样大&#xff1f; 在项目中&#xff0c;JVM调优通常源于以下典型问题及对应的调优思路&#xff0c;同时关于堆内存参数&#xff08;-Xms/-Xmx&#xff09;的设置逻…...

药监平台上传数据报资源码不存在

问题&#xff1a;电子监管码上传药监平台提示“导入的资源码不存在” 现象&#xff1a;从生产系统导出的关联关系数据包上传到药监平台时显示&#xff1a; 原因&#xff1a;上传数据包的通道的资源码与数据包的资源码不匹配。 解决方法&#xff1a;检查药监平台和生产系统的药…...

世界比较权威的新车安全评鉴协会(汽车安全性测试,自动驾驶功能测试)

NCAP是英文“New Car Assessment Program”的缩写&#xff0c;即新车评价规程&#xff0c;最能考验汽车安全性的测试&#xff0c;在自动驾驶发展迅速的现阶段&#xff0c;安全问题频发&#xff0c;自动驾驶相关功能显然也需要进行测试评价。 1. 欧洲新车安全评鉴协会&#xff…...

【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)

【Linux应用】交叉编译环境配置&#xff0c;以及最简单粗暴的环境移植&#xff08;直接从目标板上复制&#xff09; 文章目录 交叉编译器含有三方库的交叉编译直接从目标板上复制编译环境glibc库不一致报错方法1方法2 附录&#xff1a;ZERO 3烧录ZERO 3串口shell外设挂载连接Wi…...

CentOS 7 磁盘阵列搭建与管理全攻略

CentOS 7 磁盘阵列搭建与管理全攻略 在数据存储需求日益增长的今天&#xff0c;磁盘阵列&#xff08;RAID&#xff09;凭借其卓越的性能、数据安全性和可靠性&#xff0c;成为企业级服务器和数据中心的核心存储解决方案。CentOS 7 作为一款稳定且功能强大的 Linux 操作系统&am…...

CSS3布局方式介绍

CSS3布局方式介绍 CSS3布局&#xff08;Layout&#xff09;系统是现代网页设计中用于构建页面结构和控制元素排列的一组强大工具。CSS3提供了多种布局方式&#xff0c;每种方式都有其适用场景&#xff0c;其中最常用的是Flexbox和CSS Grid。 先看传统上几种布局方式&#xff…...

FPGA设计 时空变换

1、时空变换基本概念 1.1、时空概念简介 时钟速度决定完成任务需要的时间&#xff0c;规模的大小决定完成任务所需要的空间&#xff08;资源&#xff09;&#xff0c;因此速度和规模就是FPGA中时间和空间的体现。 如果要提高FPGA的时钟&#xff0c;每个clk内组合逻辑所能做的事…...

AI心理健康服务平台项目面试实战

AI心理健康服务平台项目面试实战 第一轮提问&#xff1a; 面试官&#xff1a; 请简要介绍一下AI心理健康服务平台的核心技术架构。在AI领域&#xff0c;心理健康服务的机遇主要体现在哪些方面&#xff1f;如何利用NLP技术提升用户与AI的心理健康对话体验&#xff1f; 马架构…...

Eigen稀疏矩阵类 (SparseMatrix)

1. SparseMatrix 核心属性与初始化 模板参数 cpp SparseMatrix<Scalar, Options, StorageIndex> Scalar&#xff1a;数据类型&#xff08;如 double, float&#xff09;。 Options&#xff1a;存储格式&#xff08;默认 ColMajor&#xff0c;可选 RowMajor&#xff0…...

《AI大模型趣味实战》智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用

智能Agent和MCP协议的应用实例&#xff1a;搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用 引言 随着人工智能技术的飞速发展&#xff0c;智能Agent与模型上下文协议(MCP)的应用场景越来越广泛。本报告将详细介绍如何基于Python Flask框架构建一个智能应用&…...

uniapp开发03-轮播图组件swiper的简单使用案例

uniapp开发03-轮播图组件swiper的简单使用案例&#xff01;这个仅仅是官方提供的一个轮播图组件啊。实际上我们项目开发的时候&#xff0c;会应用到其他第三方公司的轮播图组件资源&#xff01;效果更强大。兼容性更强。 废话不多说&#xff0c;我们直接上代码。分析代码。 &l…...

DAM-3B,英伟达推出的多模态大语言模型

DAM-3B是什么 DAM-3B&#xff08;Describe Anything 3B&#xff09;是英伟达推出的一款多模态大语言模型&#xff0c;专门用于为图像和视频中的特定区域生成详细描述。用户可以通过点、边界框、涂鸦或掩码等方式来标识目标区域&#xff0c;从而得到精准且符合上下文的文本描述…...

【虚幻C++笔记】碰撞检测

目录 碰撞检测参数详情示例用法 碰撞检测 显示名称中文名称CSphere Trace By Channel按通道进行球体追踪UKismetSystemLibrary::SphereTraceSingleSphere Trace By Profile按描述文件进行球体追踪UKismetSystemLibrary::SphereTraceSingleByProfileSphere Trace For Objects针…...

C++学习:六个月从基础到就业——STL:分配器与设计原理

C学习&#xff1a;六个月从基础到就业——STL&#xff1a;分配器与设计原理 本文是我C学习之旅系列的第三十篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第九篇&#xff0c;主要介绍C STL中的分配器设计原理与实现。查看完整系列目录了解更多内容。 引言 在之前…...

【Android】四大组件之Service

目录 一、什么是Service 二、启停 Service 三、绑定 Service 四、前台服务 五、远程服务扩展 六、服务保活 七、服务启动方法混用 你可以把Service想象成一个“后台默默打工的工人”。它没有UI界面&#xff0c;默默地在后台干活&#xff0c;比如播放音乐、下载文件、处理…...

TRO再添新案 TME再拿下一热门IP,涉及Paddington多个商标

4月2日和4月8日&#xff0c;TME律所代理Paddington & Company Ltd.对热门IP Paddington Bear帕丁顿熊的多类商标发起维权&#xff0c;覆盖文具、家居用品、毛绒玩具、纺织用品、游戏、电影、咖啡、填充玩具等领域。跨境卖家需立即排查店铺内的相关产品&#xff01; 案件基…...

spring-session-data-redis使用

spring-session-data-redis是spring session项目中的一个子模块&#xff0c;&#xff0c;他允许你使用Redis来存储http session&#xff0c;&#xff0c;从而支持多个应用实例之间共享session&#xff0c;&#xff0c;&#xff0c;即分布式session 原理&#xff1a; EnableRed…...