Python uvの使い方メモ

Sep 15, 2024 07:10 · 1385 words · 3 minute read python

同僚が楽しそうにuv用のライブラリを作っていました。 uvは名前は聞いたことがあったのですが使ったことはありませんでした。 数日使ってみたところ、良さそうだったのでブログに基本的な使い方をメモしておこうと思います。

目次

uvはPythonプロジェクトの管理ツール

uvはPythonのパッケージとプロジェクトを管理するツールです。 これまでpip, pip-tools, pipx, poetry, pyenv, virtualenvで実現していたことをuv一つで実現できます。

uvはRustで開発されており、他のパッケージ管理ツールよりも圧倒的に速度が早いのが売りです。

基本的な使い方

uvのインストール(pip install uv)

$ pip install uv

Pythonのインストール(uv python install {version})

現在インストールされているPythonの一覧

$ uv python list
cpython-3.13.0rc2-linux-x86_64-gnu    <download available>
cpython-3.12.6-linux-x86_64-gnu       <download available>
cpython-3.11.10-linux-x86_64-gnu      <download available>
cpython-3.10.15-linux-x86_64-gnu      <download available>
cpython-3.10.8-linux-x86_64-gnu       /usr/local/bin/python3.10
cpython-3.10.8-linux-x86_64-gnu       /usr/local/bin/python3 -> python3.10
cpython-3.10.8-linux-x86_64-gnu       /usr/local/bin/python -> python3
cpython-3.9.20-linux-x86_64-gnu       <download available>
cpython-3.8.20-linux-x86_64-gnu       <download available>
cpython-3.7.9-linux-x86_64-gnu        <download available>
pypy-3.10.14-linux-x86_64-gnu         <download available>
pypy-3.9.19-linux-x86_64-gnu          <download available>
pypy-3.8.16-linux-x86_64-gnu          <download available>
pypy-3.7.13-linux-x86_64-gnu          <download available>

バージョンを指定してPythonを追加します。 pyenvと比較すると、爆速です。

$ uv python install 3.12
Searching for Python versions matching: Python 3.12
Installed Python 3.12.6 in 3.14s
 + cpython-3.12.6-linux-x86_64-gnu

プロジェクトの作成(uv init {project})

$ uv init hello-uv
tree
.
└── hello-uv
    ├── README.md
    ├── hello.py
    └── pyproject.toml

1 directory, 3 files
$ cat hello-uv/pyproject.toml
[project]
name = "hello-uv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []

module追加(uv add {module})

requestsを追加してみます。 通信環境にもよりますが、こちらもかなり早いです。

$ uv add requests
Using Python 3.12.6
Creating virtualenv at: .venv
Resolved 6 packages in 368ms
Prepared 5 packages in 101ms
░░░░░░░░░░░░░░░░░░░░ [0/5] Installing wheels...                                                                         warning: Failed to hardlink files; falling back to full copy. This may lead to degraded performance.
         If the cache and target directories are on different filesystems, hardlinking may not be supported.
         If this is intentional, set `export UV_LINK_MODE=copy` or use `--link-mode=copy` to suppress this warning.
Installed 5 packages in 10ms
 + certifi==2024.8.30
 + charset-normalizer==3.3.2
 + idna==3.9
 + requests==2.32.3
 + urllib3==2.2.3

pyproject.tomlにも情報が追加されています。 このへんはPoetryなどと同じ使い勝手です。

$ cat pyproject.toml
[project]
name = "hello-uv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "requests>=2.32.3",
]

Pythonを実行する(uv run)

Pythonの実行方法もPoetryと同じです。

$ uv run hello.py
Hello from hello-uv!
$ cat hello.py
def main():
    print("Hello from hello-uv!")


if __name__ == "__main__":
    main()

ツールの実行(uvx)

uvxを使うと、インストールせずにツールを実行できます。pipxと同じです。 今回はRuffを使ってみます。 Ruffもuvと同じくRust製で、高速なlinterです。

$ uvx ruff check hello.py
Installed 1 package in 7ms
All checks passed!

不要なimportを追加してみます。

$ cat hello.py
import requests

def main():
    print("Hello from hello-uv!")


if __name__ == "__main__":
    main()

「使ってないよ」と教えてくれます。

$ uvx ruff check hello.py
hello.py:1:8: F401 [*] `requests` imported but unused
  |
1 | import requests
  |        ^^^^^^^^ F401
2 |
3 | def main():
  |
  = help: Remove unused import: `requests`

Found 1 error.
[*] 1 fixable with the `--fix` option.
$ uvx ruff check --fix hello.py
Found 1 error (1 fixed, 0 remaining).

不要なimportが削除されました。

$ cat hello.py

def main():
    print("Hello from hello-uv!")


if __name__ == "__main__":
    main()

数日使った感想

仕事でちょっとしたスクリプトの作成に数日使ってみました。 requests, pydantic, typingなどを使ってみましたが、全く問題なく使えています。 やはり「早い」は正義で使い勝手もいいので、しばらく使ってみようと思います。

ただ、2024年9月15日現在、uvはversion 0.4.10で、まだversionが1になっていません。 安定性を重視したい場面では引き続きPoetryを使うのが良さそうです。

GitHub - astral-sh/uv: An extremely fast Python package and project manager, written in Rust.

tweet Share