apt 还是 uv

news/2025/9/26 11:55:07/文章来源:https://www.cnblogs.com/flyingsir/p/19113211

一句话结论

  • 装系统级软件(C/CUDA、驱动、编译链) → 用 apt
  • 纯 Python 项目/虚拟环境/依赖锁文件 → 用 uv;它比 apt 里的 python3-xxx 新、快、隔离,但不能装非 Python 组件

下面给你展开对比,按“能干什么、不能干什么、该什么时候用”三个维度说清楚。


1. 能干什么

场景 apt(Debian 系) uv(Rust 写的 Py 包管理器)
装系统库/编译器/CUDA/驱动 ✅ 本职 ❌ 完全干不了
装 Debian 打好的 python3-xxx ✅ 仓库里都有 ❌ 不管系统包
创建 Python 虚拟环境 ❌ 需额外用 venv/virtualenv ✅ 一行 uv venv
装 PyPI 上的包 ❌ 只能 pip 补 ✅ 比 pip 快 10–100 倍,自带缓存与锁文件
多版本 Python 并存 ❌ 需 pyenv/源码 uv python install 3.12 一键装官方解释器
依赖解析 & 锁版本 ❌ 无 ✅ 生成 uv.lock,CI 可 100 % 复现

2. 不能干什么

  • apt 局限性
    – 带的 Python 包版本旧,更新慢;不能锁版本;无法跨项目隔离。
  • uv 局限性
    – 只认识 PyPI 轮子;遇到 CUDA、MKL、R、C++ 等非 Python 依赖时直接抓瞎,需要先用 apt/brew 装好系统库,再用 uv 装 Python 部分 。

3. 什么时候选哪个

需求 推荐命令 原因
先装显卡驱动、CUDA、编译链 sudo apt install nvidia-cuda-toolkit build-essential 系统层只有 apt 能做
起一个新 Python Web/AI 项目 uv venv && uv add torch pandas 快、隔离、自动写锁文件
跑开源项目带 requirements.txt uv pip install -r requirements.txt 速度比 pip 快一个量级
需要 Python 3.11/3.12 而系统只有 3.10 uv python install 3.11 官方解释器一键装,无需 pyenv
服务器上线部署,要 100 % 复现 uv sync --production 按锁文件精确还原,CI 友好
需要同时装 R、OpenCV C++ 头文件 sudo apt install r-base libopencv-dev uv 装不了这些非 Python 包

4. 混合打法(最佳实践)

  1. 系统层先 apt 把驱动、编译器、非 Python 依赖装好。
  2. 项目层用 uv 管理 Python 版本与 PyPI 依赖;uv.lock 进仓库,团队/CI 统一 uv sync 即可。

这样既享有 apt 的系统级能力,又拿到 uv 的极速与隔离,互不冲突。

下面给出一条“从零到跑通”的最简路径,全部用 uv 完成,不再碰系统 pipsudo
(假设你已经在 PC 上装好了 uv 本身,没装的话先 curl -LsSf https://astral.sh/uv/install.sh | sh


  1. 新建项目目录并一次性完成“建环境 + 装包”
# 1. 建文件夹
mkdir xgo_demo && cd xgo_demo# 2. 用 uv 同时完成:创建虚拟环境、安装 Python 3.11、装 xgo-pythonlib
#    (Python 版本可换成 3.10/3.12,只要 XGO 官方支持)
uv init --python 3.11          # 生成 pyproject.toml
uv add xgo-pythonlib           # 自动下载解释器、建 .venv、装包并写锁文件

执行完你会看到目录里多了
.venv/ —— 虚拟环境
uv.lock —— 精确版本锁
pyproject.toml —— 项目元数据


  1. 验证包已装好
uv run python -c "import xgo, xgoedu; print('OK')"

只要打印 OK 就说明 xgo-pythonlib 里的 xgolib.py / xgoedu.py 已就绪。


  1. 运行官方例程
    把官方文档里的 demo 代码(例如 xgo.move_forward(2) 之类)保存成 demo.py,然后
uv run python demo.py

uv run 会自动激活虚拟环境,不用你手动 source .venv/bin/activate


  1. 后续常用命令备忘
  • 再装别的 PyPI 包
    uv add numpy opencv-python
  • 升级 XGO 库
    uv add --upgrade xgo-pythonlib
  • 进交互调试
    uv run ipython # 先 uv add ipython 即可
  • 锁版本进仓库
    git add uv.lock pyproject.toml

  1. 如果官方 wheel 装不上
    XGO 目前只提供了 xgo-pythonlib-*.whl,没有源码包;uv 默认先找 wheel,找不到才会尝试编译,所以基本和 pip 行为一致。
    万一出现 ERROR: Could not find a version that satisfies the requirement xgo-pythonlib,多半是 Python 版本不兼容,把上面 --python 3.11 换成 3.9/3.10 再试即可。

一句话总结

uv init --python 3.11
uv add xgo-pythonlib
uv run python demo.py

三步到位,系统 pipsudo 完全不再需要。

在树莓派(Raspberry Pi OS)上,只要打下面任意一条命令,就能立刻看到当前用户的 PATH 变量里到底有哪些目录

  1. 最直接
echo $PATH

输出示例

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/.local/bin:/home/pi/.cargo/bin

用冒号 : 隔开的就是所有已加入 PATH 的目录。

  1. 想每个目录单独一行看
tr ':' '\n' <<< "$PATH"

结果

/usr/local/sbin
/usr/local/bin
...
/home/pi/.cargo/bin
  1. 想看系统级默认 PATH(登录 shell 还没加载用户配置时的值)
# 新建一个干净 shell,不读 ~/.bashrc
env -i bash -c 'echo $PATH'
  1. 忘了自己把 uv 放哪了?直接搜可执行文件
which uv          # 返回第一条命中,例如 /home/pi/.cargo/bin/uv
command -v uv     # 功能同上,更通用
  1. 想确认某个目录是否真的在 PATH 里
# 例:检查 ~/.local/bin 是否已加入
[[ ":$PATH:" == *":$HOME/.local/bin:"* ]] && echo "已加入" || echo "未加入"

把上面任何一条粘到终端回车即可,无需 sudo。

uv 放到 已经出现在 PATH 里的、当前用户可写 的目录即可。
从你贴出的结果看,最合适、最惯用的就是:

/home/pi/.local/bin

理由

  1. 已经在 PATH 末尾(/home/pi/.local/bin 出现与否没关系,只要你在 ~/.profile~/.bashrc 里追加一次即可)。
  2. 无需 sudo,普通用户就能写。
  3. 系统升级不会覆盖。

一步完成(假设你现在就在解压出来的目录):

# 1. 确保目录存在
mkdir -p ~/.local/bin# 2. 拷贝(或移动)可执行文件
cp uv ~/.local/bin/      # 或 mv uv ~/.local/bin/# 3. 加执行权限(下载 tar.gz 一般已带,可再确认)
chmod +x ~/.local/bin/uv# 4. 验证
uv --version             # 看到 0.x.y 即成功

如果第 4 步报 “command not found”,说明 ~/.local/bin 还没进 PATH,手动加一次:

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

再执行 uv --version 就应该正常了。

你的树莓派系统(Raspberry Pi OS ≥12)已经启用了 PEP-668 保护,禁止用系统 pip 再装任何包
因此 pip install uv 被直接拒绝,而且 uv 官方也没给 apt 仓库,所以只能用“官方单文件二进制”方式安装,与系统 Python 彻底无关

下面给出两条最简路径,30 秒搞定。


路径 A:一键脚本(自动装到 ~/.cargo/bin,无需 sudo)

# 下载并运行官方安装脚本
curl -LsSf https://astral.sh/uv/install.sh | sh
# 脚本会把 uv 放到 ~/.cargo/bin,顺便帮你写入 PATH
source ~/.cargo/env        # 立即生效
uv --version               # 验证,能看到 0.x.y 即成功

路径 B:手动下载单文件(适合离线或网络差)

# 1. 查看树莓派 CPU 架构
uname -m
# 输出 aarch64 → 用 arm64 版本;输出 armv7l → 用 armv7 版本# 2. 下载对应二进制(以 aarch64 为例)
wget https://github.com/astral-sh/uv/releases/latest/download/uv-aarch64-unknown-linux-gnu.tar.gz
tar -xzf uv-aarch64-unknown-linux-gnu.tar.gz
chmod +x uv
mv uv ~/.local/bin/        # 或任何已在 PATH 的目录
uv --version

然后就可以回到项目目录,用 uv 创建虚拟环境并安装 XGO 库了:

cd ~/Desktop/xgodemo
uv init --python 3.11      # 自动下载解释器 & 建 .venv
uv add xgo-pythonlib
uv run python -c "import xgo; print('OK')"

常见坑

  • 如果 ~/.cargo/bin~/.local/bin 不在 PATH,把
    export PATH="$HOME/.cargo/bin:$PATH" 写进 ~/.bashrc~/.zshrcsource 一次即可。
  • 树莓派 32 位系统(armv7l)请下载 uv-armv7-unknown-linux-gnueabihf.tar.gz,64 位用 aarch64 版。

装完 uv 以后,全程不再需要 sudo,也不再触碰系统 Python,PEP-668 报错自然消失。

一句话答案

  • 删环境:直接 rm -rf .venv 即可;
  • 备份/还原:把 pyproject.toml + uv.lock 拷走,在新目录 uv sync 就 100 % 原样恢复。

下面给出完整操作与“换路径再加载”的示例。


  1. 当前项目里导出“配置快照”
cd ~/Desktop/xgodemo          # 旧项目根目录
# 已经存在
#   pyproject.toml   (含 [project] dependencies = ["xgo-pythonlib", "pyserial", ...])
#   uv.lock          (精确版本锁)
# 如需手动再生成锁文件
uv lock

  1. 删除虚拟环境(可选,不占空间)
rm -rf .venv

整个环境就没了,但 只要保留上面两个文件,随时能重建。


  1. 把“配置”拷到新位置
# 例:拷到 U 盘或另一台机器
cp pyproject.toml uv.lock /media/usb/

  1. 在新目录一键还原
mkdir ~/new_workspace && cd ~/new_workspace
cp /media/usb/{pyproject.toml,uv.lock} .   # 拿到两份文件
uv sync                                    # 根据 lock 重建 .venv,包装到一模一样

uv sync 会自动:

  • 下载相同 Python 版本(pyproject.tomlrequires-python 字段)
  • uv.lock 里哈希装回 完全相同的二进制 wheel
  • 生成新的 .venv,无需再 uv add 任何包。

  1. 运行代码
uv run python your_script.py

与旧环境毫无区别。


  1. 只想“临时指定环境路径”而不是复制?
    uv 支持把虚拟环境放在任意位置,但 依旧以项目根目录的 pyproject.toml 为准
# 在旧目录外建个独立环境
uv venv /opt/venvs/xgo
# 以后每次手动指定
uv run --python /opt/venvs/xgo/bin/python your_script.py

不过官方推荐 “一个项目一个 .venv”,换机器就拷两份文件再 uv sync,最干净。


总结

  • 删除:
    rm -rf .venv
    
  • 备份:
    cp pyproject.toml uv.lock <备份路径>
    
  • 还原/迁移:
    cd <新目录> && uv sync
    

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件构造中的数据处理(sql) 6章

JDBC编程步骤 1.加载数据库驱动 2.建立数据库连接 3.创建Statement/PreparedStatement 4.执行SQL语句 5.处理查询结果(ResultSet) 6.关闭资源(Connection/Statement/ResultSet)

鹿鼎记豪侠传:Rust 重塑 iOS 江湖(下) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

US$39 CAS Mileage Reset Authorization for CGDI Prog BMW MSV80 CAS1 CAS2 CAS3 CAS3+ via OBD

CAS Mileage Reset Authorization for CGDI Prog BMW MSV80 CAS1 CAS2 CAS3 CAS3+ via OBDWith this authorization, you can change mileage on BMW CAS1 CAS2 CAS3 CAS3+ CAS3++ via OBD.No need shipping. Please p…

是普通网站地图好还是rss地图好一点九江 网站建设

为增强安全性&#xff0c;平台可安装ssl证书。对于平台不同的组成部分需要采用不同的方式&#xff0c;使用不同的证书格式&#xff1a; 一、前端 前端采用nginx部署&#xff0c;安装证书步骤如下&#xff08;linux window版一样&#xff09;&#xff1a; 1、conf目录下增加cert…

树的重心(邻接表)

输入样例:9 1 2 1 7 1 4 2 8 2 5 4 3 3 9 4 6期望输出:4代码实现:#include<bits/stdc++.h> using namespace std;const int N =1e5+10 , M=2*N;int n,m; int h[N],e[M],ne[M],idx; bool vis[N]; int ans=N ;v…

语音芯片怎样接? 语音芯片有哪些常见接口类型?

目录: 语音芯片怎样接? 语音芯片有哪些常见接口类型? UART接口如何实现数据传输? UART与I2C接口有何不同? UART通讯的常见故障有哪些? UART通信中时钟同步的原理: 语音芯片怎样接? 语音芯片的连接方式取决于其…

详细介绍:2025华为杯A题B题C题D题E题F题选题建议思路数学建模研研究生数学建模思路代码文章成品

详细介绍:2025华为杯A题B题C题D题E题F题选题建议思路数学建模研研究生数学建模思路代码文章成品pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

上饶市住房和城乡建设局网站电商培训视频教程

一、分类任务 构建分类网络模型 必须继承nn.Module且在其构造函数中需调用nn.Module的构造函数无需写反向传播函数&#xff0c;nn.Module能够利用autograd自动实现反向传播Module中的可学习参数可以通过named_parameters()返回迭代器 from torch import nn import torch.nn.f…

Gitee vs. GitLab:中国开发者为何选择本土代码托管平台?

Gitee vs. GitLab:中国开发者为何选择本土代码托管平台? 在数字化转型和信创产业蓬勃发展的背景下,中国开发者正面临一个关键选择:是继续依赖国际化的GitLab,还是拥抱本土化的Gitee?作为国内最大的代码托管平台,…

AtCoder Beginner Contest 424

Atcoder 424 A-F题解A - Isosceles 核心代码: signed main() {ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int a, b, c;cin >> a >> b >> c;if(a == b || b == c || a == c) cout << …

US$39 BAV-Key Adapter for Yanhua Mini ACDP

BAV-Key Adapter for Yanhua Mini ACDPBAV-Key Adapter will be needed for Module 1 BMW CAS1-CAS4+, Modul 9 Land Rover and Module10 for Porsche.Package List:1pc x BAV-Key Adapter for Yanhua Mini ACDP Pictu…

可以放钓鱼网站的免费空间做一个网站以及app多少钱

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 孤立词识别是语音识别领域的一个重要分支&#xff0c;其目标是将输入的语音信号转换为计算机可…

ClkLog埋点分析系统-私有化部署+轻量灵活

ClkLog 自发布以来已有两年时间。从最初的社区版,到如今不断迭代出专业版与企业版,我们一直紧跟用户需求,不断优化产品,只为做出真正“小而美、好上手、落地快”的用户行为分析系统。在ClkLog 2.0 版本发布之际,我…

级数 - Emi

几何级数定义:每一项乘以一个固定的数得到下一项(不就是等比级数?) 求和: $$S_n=\frac{a(1-r^n)}{1-r}$$ 这里\(S_n\)是前\(n\)项的和, \(a\) 是第一项, r 是公比. 然后呢,整个级数的和就是前\(n\)项和取\(n\)趋近…

基于 Docker 的 Nginx + OpenSSL 自签名证书启用 HTTPS

基于 Docker 的 Nginx + OpenSSL 自签名证书启用 HTTPS(按步骤、可直接复制)目标:在没有域名的情况下,基于 Docker 部署 Nginx,使用 OpenSSL 生成自签名证书,启用 https://<你的公网IP> 访问。 适用:开发…

PolarFire Soc System Services

PolarFire Soc System ServicesPolarFire Family System Services User Guide1、读取 序列号 16 个字节 status = MSS_SYS_get_serial_number(data_buffer, MSS_SYS_MAILBOX_DATA_OFFSET);xprintf_hex( "devic…

抄袭的网站wordpress 授权插件

引言&#xff1a;中小企业推进数字化转型的背景是多重因素叠加的结果&#xff0c;包括市场竞争压力、信息技术发展及普及、各级政府政策支持及引导、企业经营发展需求和人才结构变化等。这些因素共同推动了中小企业加快数字化转型的步伐&#xff0c;以应对日益复杂多变的市场环…

网站建设视频下载哈尔滨seo优化专注

文章目录 前言一、MyBatis 与 Hibernate 有哪些不同&#xff1f;二、MyBatis 的好处是什么&#xff1f;三、简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系&#xff1f;四、什么是 MyBatis 的接口绑定,有什么好处&#xff1f;五、接口绑定有几种实现方式,…

基于STM32的正弦波逆变器设计

一、系统架构设计 graph TD A[输入电源] --> B[输入滤波电路] B --> C[DC-DC升压模块] C --> D[SPWM生成模块] D --> E[全桥逆变电路] E --> F[LC滤波电路] F --> G[输出保护电路] G --> H[负载]…

深入解析:SDL2视频渲染

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …