From 437a8834ce2c7c50d368a410d67e20beb51d9078 Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Sun, 9 Mar 2025 23:28:35 +0800 Subject: [PATCH] Add uv --- .../index.md | 0 .../index.md | 0 .../index.md | 0 .../index.md | 0 content/posts/2025/uv 簡單介紹/featured.jpg | Bin 0 -> 46422 bytes content/posts/2025/uv 簡單介紹/index.md | 287 ++++++++++++++++++ 6 files changed, 287 insertions(+) rename content/posts/2019/{2019-12-01_[C++ 筆記] 智慧指標:unique_ptr & shared_ptr => 2019-12-01_[Cpp 筆記] 智慧指標:unique_ptr & shared_ptr}/index.md (100%) rename content/posts/2019/{2019-12-08_[C++ 筆記] rvalue reference => 2019-12-08_[Cpp 筆記] rvalue reference}/index.md (100%) rename content/posts/2019/{2019-12-15_[C++ 筆記] Lambda => 2019-12-15_[Cpp 筆記] Lambda}/index.md (100%) rename content/posts/2019/{2019-12-22_[C++ 筆記] 好用的 optional => 2019-12-22_[Cpp 筆記] 好用的 optional}/index.md (100%) create mode 100644 content/posts/2025/uv 簡單介紹/featured.jpg create mode 100644 content/posts/2025/uv 簡單介紹/index.md diff --git a/content/posts/2019/2019-12-01_[C++ 筆記] 智慧指標:unique_ptr & shared_ptr/index.md b/content/posts/2019/2019-12-01_[Cpp 筆記] 智慧指標:unique_ptr & shared_ptr/index.md similarity index 100% rename from content/posts/2019/2019-12-01_[C++ 筆記] 智慧指標:unique_ptr & shared_ptr/index.md rename to content/posts/2019/2019-12-01_[Cpp 筆記] 智慧指標:unique_ptr & shared_ptr/index.md diff --git a/content/posts/2019/2019-12-08_[C++ 筆記] rvalue reference/index.md b/content/posts/2019/2019-12-08_[Cpp 筆記] rvalue reference/index.md similarity index 100% rename from content/posts/2019/2019-12-08_[C++ 筆記] rvalue reference/index.md rename to content/posts/2019/2019-12-08_[Cpp 筆記] rvalue reference/index.md diff --git a/content/posts/2019/2019-12-15_[C++ 筆記] Lambda/index.md b/content/posts/2019/2019-12-15_[Cpp 筆記] Lambda/index.md similarity index 100% rename from content/posts/2019/2019-12-15_[C++ 筆記] Lambda/index.md rename to content/posts/2019/2019-12-15_[Cpp 筆記] Lambda/index.md diff --git a/content/posts/2019/2019-12-22_[C++ 筆記] 好用的 optional/index.md b/content/posts/2019/2019-12-22_[Cpp 筆記] 好用的 optional/index.md similarity index 100% rename from content/posts/2019/2019-12-22_[C++ 筆記] 好用的 optional/index.md rename to content/posts/2019/2019-12-22_[Cpp 筆記] 好用的 optional/index.md diff --git a/content/posts/2025/uv 簡單介紹/featured.jpg b/content/posts/2025/uv 簡單介紹/featured.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b44fb3403aa4f86a85aa42c7d5b8314e9356a871 GIT binary patch literal 46422 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 N-U;LXe%0xD_J26cLLC4A literal 0 HcmV?d00001 diff --git a/content/posts/2025/uv 簡單介紹/index.md b/content/posts/2025/uv 簡單介紹/index.md new file mode 100644 index 0000000..4606b74 --- /dev/null +++ b/content/posts/2025/uv 簡單介紹/index.md @@ -0,0 +1,287 @@ +--- +slug: uv 簡單介紹 +title: uv 簡單介紹 +description: +toc: true +authors: [awin] +tags: [python, uv] +categories: [Programming] +series: ["Software note"] +date: 2025-03-09T00:00:00 +lastmod: 2025-03-09T00:00:00 +featuredVideo: +featuredImage: +draft: false +enableComment: true +--- + +[uv](https://github.com/astral-sh/uv) 是一個很方便的 Python 管理工具。這裡是一個簡單的介紹,詳細說明請看[uv 的說明文件](https://docs.astral.sh/uv/)。 + + + +## Install uv +依官方的步驟來安裝 [Installation | uv](https://docs.astral.sh/uv/getting-started/installation/#standalone-installer)。 + + +## 管理 Python 版本 +### 列出可安裝的 Python 版本 +用 [`uv python list`](https://docs.astral.sh/uv/reference/cli/#uv-python-list) 可以列出可安裝的 Python 版本。 +如果你已經有安裝某個版本了,`` 會變成你的安裝路徑。 +```bash +❯ uv python list +cpython-3.14.0a5+freethreaded-windows-x86_64-none +cpython-3.14.0a5-windows-x86_64-none +cpython-3.13.2+freethreaded-windows-x86_64-none +cpython-3.13.2-windows-x86_64-none +cpython-3.12.9-windows-x86_64-none +cpython-3.11.11-windows-x86_64-none +cpython-3.10.16-windows-x86_64-none +cpython-3.9.21-windows-x86_64-none +cpython-3.8.20-windows-x86_64-none +cpython-3.7.9-windows-x86_64-none +pypy-3.11.11-windows-x86_64-none +pypy-3.10.16-windows-x86_64-none +pypy-3.9.19-windows-x86_64-none +pypy-3.8.16-windows-x86_64-none +pypy-3.7.13-windows-x86_64-none +``` + + +### 安裝 Python +使用 [`uv python install `](https://docs.astral.sh/uv/reference/cli/#uv-python-install) 可以安裝指定的版本,例: +```shell +uv python install 3.9 3.11 3.13 +``` +這樣就會安裝 `3.9`、`3.11`、`3.13` 這三個版本。 + +如果 `uv python install` 沒有指定版本的話,就會安裝目前能下載的最新版本。 + + +### 移除 Python +用 `uv python uninstall ` 來移除一個或多個 Python 版本,`` 一定要給。 + + +### Python 安裝路徑 +[`uv python dir`](https://docs.astral.sh/uv/reference/cli/#uv-python-dir) 會列出目前已安裝的 Python 路徑。 + + +## 專案管理 +### 單一檔案的專案 +先從簡單的開始,如果你寫了有一個檔案,可以用 uv 來管理它,當你把它 copy 給人的時候,只要用 [`uv run `](https://docs.astral.sh/uv/reference/cli/#uv-run) ,uv 就可以幫你完成相依套件的安裝,讓檔案可以順利執行。 + +先從建立檔案開始,例: +```shell +uv init --python 3.11 --script hello.py +``` + +這邊我們讓 uv 幫我們建立 `hello.py` 這個檔案,使用的環境是 Python 3.11。如果你沒有安裝 Python 3.11 ,那麼 uv 會自動幫你安裝,很方便吧。 + +`hello.py` 的內容: +```python +# /// script +# requires-python = ">=3.11" +# dependencies = [] +# /// + + +def main() -> None: + print("Hello from hello.py!") + + +if __name__ == "__main__": + main() +``` + +前4行就是給 uv 看的 metadata,uv 靠它來維護執行環境與套件。 + + +#### 安裝套件 +使用 [`uv add`](https://docs.astral.sh/uv/reference/cli/#uv-add) 來安裝套件,假設我們需要使用 `rich` 這個套件: +``` +> uv add rich --script hello.py +Updated `hello.py` +``` + +`hello.py` 的內容會變成: +```python +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "rich", +# ] +# /// + + +def main() -> None: + print("Hello from hello.py!") + + +if __name__ == "__main__": + main() +``` + +可以看到 dependencies 增加了 rich 套件。之後你將 `hello.py` 傳給別人,那人只需要用 `uv run hello.py`,uv 就會自動安裝需要的 Python 版本與相依套件。 + + +#### 移除套件 +用 [`uv remove`](https://docs.astral.sh/uv/reference/cli/#uv-remove) 可以移除套件,例如 `uv remove rich --script hello.py`。uv 就會將 rich 從 metadata 移除。 + + +### 資料夾的專案 +實務上單一檔案還是不方便,uv 管理資料夾是用 [`uv init`](https://docs.astral.sh/uv/reference/cli/#uv-init),例: +``` +uv init hello_uv --python 3.13 +``` + +uv 會建立 hello_uv 資料夾,Python 版本是 3.13。 +資料夾的內容會有: +``` +.git +.gitignore +.python-version +main.py +pyproject.toml +README.md +``` + +- `.git`, `.gitignore`: uv 會自動建立 git repo,但是還沒 commit。 +- `.python-version`: 這個專案使用的 Python 版本,如果你在 `uv init` 的時候沒有指定 Python 版本,那麼就會用**已安裝的最高版本**。 +- `main.py`: 你的程式 +- `pyproject.toml`: `pyproject.toml`是 [PEP 518](https://peps.python.org/pep-0518/) 與 [PEP 621](https://peps.python.org/pep-0621/) 中提出的標準,用來定義 Python 的執行環境的設定檔 + + +#### 執行檔案 +一樣用 `uv run` 就可以執行,例:`uv run main.py`。 + +在 `uv run` 執行過後,會多出一個 `uv.lock` 的檔案,這個檔案由 uv 管理(`uv add`會用到),`uv.lock` 基本上就是 `pyproject.toml` 的內容,uv 根據這個檔案來管理執行環境與套件。 + + +#### 安裝套件 +在 uv 管理的資料夾內安裝套件有2個方式,`uv pip install` 與 `uv add`。 + + +##### `uv add` +例如我們用 `uv add` 安裝 rich 這個套件: +```shell +uv add rich +``` + +uv 會幫你修改 `pyproject.toml` 與 `uv.lock`。 + +`pyproject.toml` 的內容會變成: +``` +[project] +name = "hello-uv" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "rich>=13.9.4", +] +``` + +dependencies 會多出 rich 套件以及版號。 + +而 `uv.lock` 也會同步修改,內容如下: +``` +version = 1 +revision = 1 +requires-python = ">=3.13" + +[[package]] +name = "hello-uv" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "rich" }, +] + +[package.metadata] +requires-dist = [{ name = "rich", specifier = ">=13.9.4" }] + +// 略 + +[[package]] +name = "rich" +version = "13.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +// 略 +``` + +這樣屆時你將資料夾分享出去,只要用 `uv run` 就可以了,uv 會自動安裝相應的環境與套件,很方便。 + + +##### `uv pip` +`uv pip` 就很單純,它就是幫你裝套件而已,在 `pyproject.toml` 與 `uv.lock` 內都不會有紀錄。 + + +#### 移除套件 +使用 `uv add` 安裝的套件就用 `uv remove` 來移除。 + +使用 `uv pip install` 安裝的套件就用 `uv pip uninstall` 來移除。 + + +##### `pyproject.toml` 被修改了怎麼辦? +先執行 `uv lock` 來將 `pyproject.toml` 的內容更新到 `uv.lock` ,再執行 `uv sync` 來更新環境與套件。 + + +## 方便的 `uv tool` +### 安裝工具 +之前安裝的套件都是給某個檔案或是資料夾使用,但是 Python 世界裡有些套件是可以單獨使用的,像是 yt-dlp 可以在命令列當作一個工具來用: +``` +yt-dlp https://www.youtube.com/watch?v=111 +``` + +這時候就可以用 `uv tool install yt-dlp` ,uv 會建立一個環境專供 yt-dlp ,不用怕污染到其他專案。 +安裝好之後,yt-dlp 就可以直接使用了。 + + +### 移除工具 +`uv tool uninstall ` 可以移除工具(套件)。 + + +### 更新工具 +`uv tool upgrade ` 可以更新工具(套件)。 + + +### 工具安裝位置 +`uv tool dir` 會列出工具安裝路徑。 + + +## 用 uv 執行 `.py` +這邊的`.py` 檔是指沒有被 uv 管理的檔案,假設你拿到一個檔案 `test.py`,你可以用 uv 來指定 Python 版本與套件來執行它。 +先從最簡單的開始,例: +``` +uv run test.py +``` + +uv 會找一個 Python 版本來執行它。uv 挑選 Python 版本的規則是這樣: +1. 如果目前目錄有 `.python-version`,而且裡面有版號,那就用這一版來執行。 +2. 目前已經有啟用了某個虛擬環境,那就用這個虛擬環境來執行。 +3. 目前的目錄有 `.venv` 這個資料夾,那就用`.venv` 這個資料夾裡面紀錄的版號來執行。 +4. uv 已安裝的最高版本。 +5. 目前環境有能找到的第一個 Python 執行檔。 + +當然你也可以指定一個 Python 版本來執行: +``` +uv run --python 3.11 test.py +``` + +如果指定的版本沒有安裝,uv 會自動安裝。 + +如果檔案裡面有需要安裝的套件,也可以寫出需要的套件,使用 `--with` 參數: +``` +uv run --python 3.11 --with rich test.py +``` + +uv 會建立一個臨時的虛擬環境,幫你安裝 rich 套件,並執行 `test.py`。 + +### 管理臨時的虛擬環境 +用 `uv cache dir` 列出臨時的虛擬環境的路徑。 + +用 [`uv cache clean`](https://docs.astral.sh/uv/reference/cli/#uv-cache-clean) 清除臨時的虛擬環境。