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)](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)](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)](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 %}