uv
===
###### tags: `Python`
###### tags: `Python`, `uv`, `pip`, `virtualenv`, `conda`
<br>
[TOC]
<br>
:::info
### :bulb: **一種新型虛擬環境,類似 virtualenv, conda 環境**
- **比較**
- [uv 和 virtualenv 的差異在哪?](#uv-和-virtualenv-的差異在哪?)
- [uv 跟 conda 的功能上差異呢?](#uv-跟-conda-的功能上差異呢?)
:::
<br>
## 安裝 uv 執行檔
> https://docs.astral.sh/uv/configuration/installer/
```
curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR="/your/software/path" sh
```
- ### 執行範例
```
$ curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR="/home/tj/software/python-uv" sh
downloading uv 0.9.10 x86_64-unknown-linux-gnu
no checksums to verify
installing to /home/tj/software/python-uv
uv
uvx
everything's installed!
To add $HOME/software/python-uv to your PATH, either restart your shell or run:
source $HOME/software/python-uv/env (sh, bash, zsh)
source $HOME/software/python-uv/env.fish (fish)
```
<br>
## uv (DEMO)
```bash=
# 建立專案資料夾
mkdir my_pandas
cd my_pandas
# 建立虛擬環境&啟用
uv venv myenv-20250414 -p 3.10
source myenv-20250414/bin/activate
# 安裝 panda 套件
up pip install pandas
# 查詢已安裝套件
uv pip list
```
- ### 對照 virtualenv 版本
```bash=
# virtualenv 須先安裝:pip install virtualenv
# 建立虛擬環境(使用 Python 3.10)
virtualenv myenv-20250414 -p python3.10
# 啟用虛擬環境
source myenv-20250414/bin/activate
# 安裝 pandas
pip install pandas
```
- ### 對照 conda 版本
```bash=
# 建立 conda 環境(使用 Python 3.10)
conda create -n myenv-20250414 python=3.10 pandas -y
# 啟用 conda 環境
conda activate myenv-20250414
```
- 或事後在安裝:
```bash=
# 建立 conda 環境(使用 Python 3.10)
conda create -n myenv-20250414 python=3.10
# 啟用 conda 環境
conda activate myenv-20250414
# 安裝 pandas
conda install pandas
```
- 也可以指定套件來源,例如用 conda-forge(更常見於開源套件):
```bash
conda install -c conda-forge pandas
```
- 實用指令
| 用途 | 指令 |
|-----|------|
| 查看已安裝套件 | conda list |
| 搜尋 pandas 版本 | conda search pandas |
| 更新 pandas | conda update pandas |
| 移除 pandas | conda remove pandas |
<br>
<hr>
<br>
## 討論
### uv 和 virtualenv 的差異在哪?
- ### gpt-4o (2025/04/14)
> `uv` 與 `virtualenv` 的差異比較
> [](https://hackmd.io/_uploads/rkRj_gcAJx.png)
### 🧩 基本定義
| 工具 | 說明 |
|--------------|------|
| **virtualenv** | 傳統的 Python 虛擬環境建立工具,可與 Python 官方的 `venv` 模組類比。用途是建立隔離的 Python 執行環境。 |
| **uv** | 是一個 **用 Rust 寫成的超快 Python 包管理器**,類似於 `pip` + `venv` + `virtualenv` + `pip-tools` 的整合體。強調速度與效能,能快速建立虛擬環境與安裝套件。 |
---
### ⚙️ 功能比較
| 功能 | `virtualenv` | `uv` |
|--------------------------------|--------------|------|
| 建立虛擬環境 | ✅ | ✅(內建,使用 `uv venv`) |
| 安裝 Python 套件 | ❌(需搭配 pip) | ✅(`uv pip install`) |
| 支援 `.lock` 檔案(鎖定依賴) | ❌(需另用 pip-tools) | ✅(`uv pip compile`) |
| 安裝速度 | 一般 | 🚀 極快(Rust 編寫、平行處理) |
| 對標對象 | `virtualenv`, `venv` | `pip`, `virtualenv`, `pip-tools`, `poetry` |
| 相依工具需求 | 只需 Python | 需安裝 `uv` 執行檔 |
---
### 📦 安裝方式
**安裝 `virtualenv`**
```
pip install virtualenv
virtualenv venv
source venv/bin/activate
```
**安裝 `uv`**
```
curl -Ls https://astral.sh/uv/install.sh | sh
uv venv
source .venv/bin/activate
uv pip install requests
```
---
### 🧠 總結
- 如果你只是想要 **建立虛擬環境**,`virtualenv` 就足夠。
- 如果你想要 **又快又現代、能鎖定依賴、全部整合一起的開發體驗**,那就用 `uv`。
> `uv` 是現代 Python 開發中值得關注的整合解決方案,適合追求效率與自動化的使用者。
<br>
### uv 跟 conda 的功能上差異呢?
- ### gpt-4o (2025/04/14)
> uv vs conda 功能比較筆記
> [](https://hackmd.io/_uploads/rkuStxqC1x.png)
### 🧩 基本定義
| 工具 | 說明 |
|------|------|
| **uv** | 新一代的 Python 工具鏈(用 Rust 開發),整合了 `pip`, `venv`, `pip-tools`,主打速度快與相依性鎖定。只管理 **Python 套件**,使用 PyPI。 |
| **conda** | 跨語言的套件與環境管理工具,不只限於 Python。支援 Python、R、C、Fortran 等等,也能管理 **系統級函式庫(如 libjpeg)**。使用 Conda 自有的套件倉庫。 |
---
### ⚙️ 功能對比
| 功能 | `uv` | `conda` |
|------|------|---------|
| 虛擬環境管理 | ✅ `uv venv` | ✅ `conda create` |
| Python 套件安裝 | ✅(PyPI) | ✅(Conda repo,也可 pip) |
| 系統函式庫(libX, ffmpeg) | ❌ | ✅ ✅ ✅ |
| 多語言支援(非 Python) | ❌ | ✅(R, C++, …) |
| 相依鎖定(lockfile) | ✅(`uv pip compile`) | ⚠️(非原生,需 conda-lock) |
| 安裝速度 | 🚀 快(Rust) | ⚠️ 慢(解相依慢) |
| 原生支援 wheels | ✅(PyPI) | ❌(不是透過 PyPI) |
| 套件庫來源 | PyPI | Conda Repo(Anaconda、conda-forge) |
---
### 📦 生態與使用場景建議
| 類型 | 建議工具 | 原因 |
|------|-----------|-------|
| **純 Python 專案**(如 Web 開發, 機器學習) | `uv` | 快速、輕量、符合 Python 社群習慣(PyPI) |
| **科學計算/數值分析專案**(NumPy, SciPy, OpenCV) | `conda` | 可以裝非 Python 的底層 C/C++ 函式庫 |
| **混合語言需求**(R + Python)或需要 `libxyz` 支援 | `conda` | 最方便 |
| **效能要求**(CI/CD、快速安裝) | `uv` | 比 conda 快 3~10 倍 |
---
### 🧠 總結一句話
- `uv` 是 **PyPI 世界的極速 pip + venv 管理員**。
- `conda` 是 **跨語言的科學/資料環境管理工具**。
<br>
### uv & conda 為何在系統函式庫(libX, ffmpeg)有支援上差異?能舉實際例子來說明?
- ### gpt-4o (2025/04/14)
> uv vs conda 在系統函式庫支援上的差異
> [](https://hackmd.io/_uploads/S12o9l50Jx.png)
### 🧠 為什麼 `uv` 無法處理系統函式庫,而 `conda` 可以?
| 比較項目 | `uv` | `conda` |
|----------|------|--------|
| 套件來源 | PyPI(Python-only wheel) | Conda 自有倉庫(包含 C/C++ 套件) |
| 能否處理 C/C++ 系統函式庫 | ❌(wheel 無法包含) | ✅(有 prebuilt binary + 相依 C lib) |
| 安裝流程 | 安裝 `.whl` 或編譯 `.tar.gz` | 安裝 `.tar.bz2` 的 binary,**包含所有依賴** |
| 與 OS 整合 | 須仰賴 OS 安裝 lib(如 `apt install libjpeg`) | 不需安裝 OS 套件,conda 環境中已內建 |
---
### 🎯 實際案例比較
#### 📌 案例:安裝 `opencv-python` 處理影像
##### 使用 `uv`(或 `pip`)
```
uv pip install opencv-python
```
- 問題:若使用 `cv2.imwrite()` 存圖成 JPEG、PNG 等格式時,會報錯:
```
error: (-215:Assertion failed) !_img.empty() in function 'imwrite'
```
- 原因:系統缺 `libjpeg` 或 `libpng`(這些為 C 寫成的函式庫,不在 PyPI 的 wheel 內)
- 解法(需自己安裝系統套件):
```
sudo apt install libjpeg libpng
```
##### 使用 `conda`
```
conda create -n img python=3.11 opencv
```
- ✅ 一行指令搞定,`conda` 自動處理 `libjpeg`, `libpng`, `zlib`, `ffmpeg`,`cv2.imwrite()` 可直接使用
- 不需額外安裝系統套件
---
#### 📌 案例:安裝 `ffmpeg` 處理影片
##### 使用 `uv`/`pip` + `moviepy`
```
uv pip install moviepy
```
- 再執行:
```
from moviepy.editor import VideoFileClip
clip = VideoFileClip("video.mp4")
```
- 會報錯:
```
OSError: MoviePy error: failed to read the duration of file video.mp4...
```
- 原因:系統未安裝 `ffmpeg` binary
##### 使用 `conda`
```
conda install -c conda-forge moviepy ffmpeg
```
- ✅ `ffmpeg` binary 一併被安裝,可直接使用
---
### 🔧 觀念整理
| 類別 | PyPI (`uv/pip`) | Conda |
|------|-----------------|--------|
| 安裝 `cv2` 成功 | ✅ | ✅ |
| 可以存 JPEG 圖片 | ❌(缺 libjpeg) | ✅(已內建) |
| 安裝 `moviepy` 成功 | ✅ | ✅ |
| 能正確處理影片檔 | ❌(缺 ffmpeg binary) | ✅(內建 ffmpeg) |
---
### 🧠 總結一句話
> `uv` 快、乾淨、純 Python,但凡涉及底層函式庫(如 C 的 libjpeg、ffmpeg)就得靠系統幫忙;
> `conda` 重,但全包,**連系統函式庫都打包好給你**,開箱即用。
<br>
{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}