Rye & uv 追っかけ
Rye の作者が↓のような投稿をしており、uv が気になったので個人のメモとして追っかけをする。
uv を開発しているのは最近話題の Ruff を開発している Astral。
UPDATE 20240226: Rye が astral_sh 管理化に置かれた
Rye で uv を有効化するにはこれ
サポートされたのは https://github.com/mitsuhiko/rye/releases/tag/0.24.0 からなので、とりあえず rye self update
して以下のコマンドで有効化すればOK
rye config --set-bool behavior.use-uv=true
この Scrap について
この Scrap に記載の内容はたまに記事にまとめなおして見やすくしています。
良ければこちらもどうぞ。
Rye と uv の関係
uv は現状だとpip and pip-compile を置き換えるものと紹介されている。
Rye では以前から pip-tools から何かに移行したいねという issue が上がっていて、これとは別でしばらく前からRye と uv 制作者同士で話をしていて、Rye がバックエンドで uv をサポートするようになったっぽい(このへん雑に読んでるのでニュアンスが間違ってるかもだが)
Rye の今後について
Rye がすぐに引退してしまうようなことはなさそうだが、mitsuhiko さん的には Rye が uv などの Cargo for Python を目指すツールに吸収されていくことを望んでそう。
Cargo for Python なツールを目指す uv は要チェックだ。
uv のREADMEを読みながら uv 単体で触ってみた。
venv を作成する
❯ uv venv
× Querying Python at `/Users/zztkm/.rye/shims/rye` failed with status exit status: 2:
│ --- stdout:
│ --- stderr:
│ error: unexpected argument found
│ ---
あ、自分の python3 は rye の shimlink になってる?のでうまく処理できなかったのかな。。。
rye でインストールしたインタプリタを直接指定してみる。
❯ rye toolchain list
cpython@3.12.0 (/Users/zztkm/.rye/py/cpython@3.12.0/install/bin/python3)
cpython@3.11.7 (/Users/zztkm/.rye/py/cpython@3.11.7/install/bin/python3)
cpython@3.11.6 (/Users/zztkm/.rye/py/cpython@3.11.6/install/bin/python3)
# とりあえず 3.12 を指定しておく
❯ uv venv -p /Users/zztkm/.rye/py/cpython@3.12.0/install/bin/python3
Using Python 3.12.0 interpreter at /Users/zztkm/.rye/py/cpython@3.12.0/install/bin/python3.12
Creating virtualenv at: .venv
できた!。venv も一瞬で作られてビビる。どういう仕組になっているか気になるがあとで体力があれば深ぼる。
pip install をしてみる。例にある flask のインストールで、pipとどの程度差が出るのか確かめてみる。
uv
❯ time uv pip install flask
Resolved 7 packages in 9ms
Installed 7 packages in 10ms
+ blinker==1.7.0
+ click==8.1.7
+ flask==3.0.2
+ itsdangerous==2.1.2
+ jinja2==3.1.3
+ markupsafe==2.1.5
+ werkzeug==3.0.1
uv pip install flask 0.01s user 0.04s system 103% cpu 0.053 total
pip
❯ time pip install flask
Collecting flask
Obtaining dependency information for flask from https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl.metadata
Downloading flask-3.0.2-py3-none-any.whl.metadata (3.6 kB)
Collecting Werkzeug>=3.0.0 (from flask)
Obtaining dependency information for Werkzeug>=3.0.0 from https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl.metadata
Using cached werkzeug-3.0.1-py3-none-any.whl.metadata (4.1 kB)
Collecting Jinja2>=3.1.2 (from flask)
Obtaining dependency information for Jinja2>=3.1.2 from https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl.metadata
Downloading Jinja2-3.1.3-py3-none-any.whl.metadata (3.3 kB)
Collecting itsdangerous>=2.1.2 (from flask)
Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting click>=8.1.3 (from flask)
Obtaining dependency information for click>=8.1.3 from https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl.metadata
Using cached click-8.1.7-py3-none-any.whl.metadata (3.0 kB)
Collecting blinker>=1.6.2 (from flask)
Obtaining dependency information for blinker>=1.6.2 from https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl.metadata
Downloading blinker-1.7.0-py3-none-any.whl.metadata (1.9 kB)
Collecting MarkupSafe>=2.0 (from Jinja2>=3.1.2->flask)
Obtaining dependency information for MarkupSafe>=2.0 from https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl.metadata
Downloading MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl.metadata (3.0 kB)
Downloading flask-3.0.2-py3-none-any.whl (101 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 101.3/101.3 kB 4.5 MB/s eta 0:00:00
Downloading blinker-1.7.0-py3-none-any.whl (13 kB)
Using cached click-8.1.7-py3-none-any.whl (97 kB)
Downloading Jinja2-3.1.3-py3-none-any.whl (133 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.2/133.2 kB 13.8 MB/s eta 0:00:00
Using cached werkzeug-3.0.1-py3-none-any.whl (226 kB)
Downloading MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl (18 kB)
Installing collected packages: MarkupSafe, itsdangerous, click, blinker, Werkzeug, Jinja2, flask
Successfully installed Jinja2-3.1.3 MarkupSafe-2.1.5 Werkzeug-3.0.1 blinker-1.7.0 click-8.1.7 flask-3.0.2 itsdangerous-2.1.2
WARNING: There was an error checking the latest version of pip.
pip install flask 0.60s user 0.18s system 49% cpu 1.559 total
体感でわかるくらい uv が速い。
ソフトウェアの比較は得意ではないので、あとは自由に使ってみての感想を書いていく。
あと、rye の uv バックエンドも使ってみる。
とりあえず普段自分は rye を使っているので rye で uv を使うことで速度的なところがどの程度変化するのか確かめてみる。
- flask を add 済
まずデフォルト
❯ time rye sync
Initializing new virtualenv in /Users/zztkm/dev/sandbox/pydev/rye-not-uv-test/.venv
Python version: cpython@3.12.0
Generating production lockfile: /Users/zztkm/dev/sandbox/pydev/rye-not-uv-test/requirements.lock
Generating dev lockfile: /Users/zztkm/dev/sandbox/pydev/rye-not-uv-test/requirements-dev.lock
Installing dependencies
Looking in indexes: https://pypi.org/simple/
Obtaining file:///. (from -r /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/tmpbahbtfpn (line 3))
Installing build dependencies ... done
Checking if build backend supports build_editable ... done
Getting requirements to build editable ... done
Preparing editable metadata (pyproject.toml) ... done
Collecting blinker==1.7.0 (from -r /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/tmpbahbtfpn (line 1))
Using cached blinker-1.7.0-py3-none-any.whl.metadata (1.9 kB)
Collecting click==8.1.7 (from -r /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/tmpbahbtfpn (line 2))
Using cached click-8.1.7-py3-none-any.whl.metadata (3.0 kB)
Collecting flask==3.0.2 (from -r /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/tmpbahbtfpn (line 4))
Using cached flask-3.0.2-py3-none-any.whl.metadata (3.6 kB)
Collecting itsdangerous==2.1.2 (from -r /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/tmpbahbtfpn (line 5))
Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting jinja2==3.1.3 (from -r /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/tmpbahbtfpn (line 6))
Using cached Jinja2-3.1.3-py3-none-any.whl.metadata (3.3 kB)
Collecting markupsafe==2.1.5 (from -r /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/tmpbahbtfpn (line 7))
Using cached MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl.metadata (3.0 kB)
Collecting werkzeug==3.0.1 (from -r /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/tmpbahbtfpn (line 8))
Using cached werkzeug-3.0.1-py3-none-any.whl.metadata (4.1 kB)
Using cached blinker-1.7.0-py3-none-any.whl (13 kB)
Using cached click-8.1.7-py3-none-any.whl (97 kB)
Using cached flask-3.0.2-py3-none-any.whl (101 kB)
Using cached Jinja2-3.1.3-py3-none-any.whl (133 kB)
Using cached MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl (18 kB)
Using cached werkzeug-3.0.1-py3-none-any.whl (226 kB)
Building wheels for collected packages: rye-not-uv-test
Building editable for rye-not-uv-test (pyproject.toml) ... done
Created wheel for rye-not-uv-test: filename=rye_not_uv_test-0.1.0-py3-none-any.whl size=1409 sha256=87613278ee3f5431d8443e051b8fd2253cb6f0501fbdbd7a7237218fc6554874
Stored in directory: /private/var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/pip-ephem-wheel-cache-nnl7k1a8/wheels/8b/19/c8/73a63a20645e0f1ed9aae9dd5d459f0f7ad2332bb27cba6c0f
Successfully built rye-not-uv-test
Installing collected packages: werkzeug, rye-not-uv-test, markupsafe, jinja2, itsdangerous, flask, click, blinker
Successfully installed blinker-1.7.0 click-8.1.7 flask-3.0.2 itsdangerous-2.1.2 jinja2-3.1.3 markupsafe-2.1.5 rye-not-uv-test-0.1.0 werkzeug-3.0.1
Done!
rye sync 3.12s user 0.93s system 73% cpu 5.506 total
次に uv
❯ rye config --set-bool behavior.use-uv=true
❯ time rye sync
Initializing new virtualenv in /Users/zztkm/dev/sandbox/pydev/rye-uv-test/.venv
Python version: cpython@3.12.0
Generating production lockfile: /Users/zztkm/dev/sandbox/pydev/rye-uv-test/requirements.lock
Built file:///Users/zztkm/dev/sandbox/pydev/rye-uv-test Built 1 editable in 853ms
Resolved 8 packages in 1.66s
Generating dev lockfile: /Users/zztkm/dev/sandbox/pydev/rye-uv-test/requirements-dev.lock
Built file:///Users/zztkm/dev/sandbox/pydev/rye-uv-test Built 1 editable in 264ms
Resolved 8 packages in 273ms
Installing dependencies
Built file:///Users/zztkm/dev/sandbox/pydev/rye-uv-test Built 1 editable in 237ms
Resolved 7 packages in 1ms
Downloaded 7 packages in 86ms
Installed 8 packages in 4ms
+ blinker==1.7.0
+ click==8.1.7
+ flask==3.0.2
+ itsdangerous==2.1.2
+ jinja2==3.1.3
+ markupsafe==2.1.5
+ rye-uv-test==0.1.0 (from file:///Users/zztkm/dev/sandbox/pydev/rye-uv-test)
+ werkzeug==3.0.1
Done!
rye sync 0.53s user 0.39s system 30% cpu 2.994 total
たしかに速い。
これ大規模プロジェクトになったときにかなりわかりやすい差が出そう。
特に問題ない間は rye で uv を使い続けてみる。
uv の help と version
❯ uv -h
Usage: uv [OPTIONS] <COMMAND>
Commands:
pip Resolve and install Python packages
venv Create a virtual environment
clean Clear the cache
help Print this message or the help of the given subcommand(s)
Options:
-q, --quiet Do not print any output
-v, --verbose Use verbose output
--color <COLOR> Control colors in output [default: auto] [possible values: auto, always, never]
-n, --no-cache Avoid reading from or writing to the cache
--cache-dir <CACHE_DIR> Path to the cache directory [env: UV_CACHE_DIR=]
-h, --help Print help (see more with '--help')
-V, --version Print version
❯ uv --version
uv 0.1.1
clean コマンドでキャッシュクリアできるっぽい。
❯ uv clean -h
Clear the cache
Usage: uv clean [OPTIONS] [PACKAGE]...
Arguments:
[PACKAGE]... The packages to remove from the cache
Options:
-q, --quiet Do not print any output
-v, --verbose Use verbose output
--color <COLOR> Control colors in output [default: auto] [possible values: auto, always, never]
-n, --no-cache Avoid reading from or writing to the cache
--cache-dir <CACHE_DIR> Path to the cache directory [env: UV_CACHE_DIR=]
-h, --help Print help (see more with '--help')
-V, --version Print version
試しに flask を消し飛ばす
❯ uv clean flask
Removed 7 files for flask (61.7KiB)
この間 numpy を python3.12 環境にインストールするときにキャッシュでハマったのでクリアを簡単にできるの嬉しいかも。
Windows で Rye の uv を有効化してみた。
❯ rye sync
Reusing already existing virtualenv
Generating production lockfile: requirements.lock
warning: uv enabled in config but not supported on windows
Generating dev lockfile: requirements-dev.lock
warning: uv enabled in config but not supported on windows
Installing dependencies
ということで Windows ではサポートされていないらしく、この開発者体験が今すぐ欲しい人は linux or mac でやりましょう。
Rye 0.25.0 がリリースされて内部で利用する uv のバージョンが 0.1.5になった。
- Rye の uv が Windows サポートしたっぽい
- うれしい
- その他細々した変更
依存先がURL依存を持っているとこける
結論
- uv の仕様
- URL依存はプロジェクトで直接依存管理されている必要がある
- URLは依存は直接の依存として表現しましょう
- 面倒だけど...
再現手順
❯ rye --version
rye 0.25.0
commit: 0.25.0 (d8e00cea1 2024-02-19)
platform: macos (aarch64)
self-python: cpython@3.12
symlink support: true
uv enabled: true
❯ rye init tox-rye-uv
❯ cd rye tox-uv
❯ rye add --dev tox-rye --git https://github.com/bluss/tox-rye❯ rye sync
Reusing already existing virtualenv
Generating production lockfile: /Users/zztkm/dev/sandbox/pydev/tox-rye-uv/requirements.lock
warning: Requirements file /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/.tmpK0TR5T/requirements.txt does not contain any dependencies
Built file:///Users/zztkm/dev/sandbox/pydev/tox-rye-uv Built 1 editable in 302ms
Resolved 1 package in 463ms
Generating dev lockfile: /Users/zztkm/dev/sandbox/pydev/tox-rye-uv/requirements-dev.lock
warning: Requirements file /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/.tmpqOjgnq/requirements.txt does not contain any dependencies
Built file:///Users/zztkm/dev/sandbox/pydev/tox-rye-uv Built 1 editable in 248ms
error: Package `virtualenv-rye-discovery` attempted to resolve via URL: git+https://github.com/bluss/virtualenv-rye-discovery@0.3.0. URL dependencies must be expressed as direct requirements or constraints. Consider adding `virtualenv-rye-discovery @ git+https://github.com/bluss/virtualenv-rye-discovery@0.3.0` to your dependencies or constraints file.
error: could not write dev lockfile for project
Caused by:
failed to generate lockfile
回避方法(これはやりたくない
virtualenv-rye-discovery を直接依存に含めると回避できたので uv のバグかも?ある程度調べたら issue 立てるかなにかしてみる。
❯ rye add --dev virtualenv-rye-discovery --git https://github.com/bluss/virtualenv-rye-discovery
Added virtualenv-rye-discovery @ git+https://github.com/bluss/virtualenv-rye-discovery@4958f87a8fef73a1dddbb02fa3a98c93bab48377 as dev dependency
❯ rye sync
Reusing already existing virtualenv
Generating production lockfile: /Users/zztkm/dev/sandbox/pydev/tox-rye-uv/requirements.lock
Built file:///Users/zztkm/dev/sandbox/pydev/tox-rye-uv Built 1 editable in 326ms
Resolved 1 package in 489ms
Generating dev lockfile: /Users/zztkm/dev/sandbox/pydev/tox-rye-uv/requirements-dev.lock
warning: Requirements file /var/folders/jf/ppd8_ywn5j94k064g559vgq00000gp/T/.tmpMEtKPA/requirements.txt does not contain any dependencies
Built file:///Users/zztkm/dev/sandbox/pydev/tox-rye-uv Built 1 editable in 241ms
Updating https://github.com/bluss/virtualenv-rye-discovery (0.3.0) Resolved 7 packages in 983ms
Updated https://github.com/bluss/virtualenv-rye-discovery (4958f87) Installing dependencies
Built file:///Users/zztkm/dev/sandbox/pydev/tox-rye-uv Built 1 editable in 242ms
Resolved 6 packages in 0ms
Built tox-rye @ git+https://github.com/bluss/tox-rye@d1348e996d642e947cd0fb158ecdbcfe0f386af3
Built virtualenv-rye-discovery @ git+https://github.com/bluss/virtualenv-rye-discovery@4958f87a8fef73a1dddbb02fa3a98c93bab48377 Downloaded 6 packages in 585ms
Installed 7 packages in 6ms
+ distlib==0.3.8
+ filelock==3.13.1
+ platformdirs==4.2.0
+ tox-rye==0.3.0 (from git+https://github.com/bluss/tox-rye@d1348e996d642e947cd0fb158ecdbcfe0f386af3)
+ tox-rye-uv==0.1.0 (from file:///Users/zztkm/dev/sandbox/pydev/tox-rye-uv)
+ virtualenv==20.25.0
+ virtualenv-rye-discovery==0.3.0 (from git+https://github.com/bluss/virtualenv-rye-discovery@4958f87a8fef73a1dddbb02fa3a98c93bab48377)
Done!
関連ページ
uv 単体で pip install してみてもエラーがでた。
❯ uv pip install "tox-rye @ git+https://github.com/bluss/tox-rye.git@0.3.0"
Updated https://github.com/bluss/tox-rye.git (d1348e9) error: Package `virtualenv-rye-discovery` attempted to resolve via URL: git+https://github.com/bluss/virtualenv-rye-discovery@0.3.0. URL dependencies must be expressed as direct requirements or constraints. Consider adding `virtualenv-rye-discovery @ git+https://github.com/bluss/virtualenv-rye-discovery@0.3.0` to your dependencies or constraints file.
DeepL 翻訳
エラーが発生しました: パッケージ
virtualenv-rye-discovery
は URL: git+https://github.com/bluss/virtualenv-rye-discovery@0.3.0 から解決しようとしました。URL 依存は直接的な要件または制約として表現する必要があります。virtualenv-rye-discovery @ git+https://github.com/bluss/virtualenv-rye-discovery@0.3.0` を依存ファイルまたは制約ファイルに追加することを検討してください。
なるほど。uv の制限なのか。(というか rye 使ってても同じエラーが出てたのでちゃんと見てなかった...
ではこれはバグではなく仕様なので、大人しくそれぞれ rye add しておくのが良さそう。
Rye uv で private GitHub Repository の依存を解決したい場合
git credential.helper の設定がないと以下のようなエラーになる。
> rye lock
error: Failed to download and build: hello @ git+https://github.com/zztkm/hello-private@v0.1.0
Caused by: Git operation failed
Caused by: failed to clone into: /Users/zztkm/Library/Caches/uv/git-v0 ...
Caused by: failed to authenticate when downloading repository
* attempted to find username/password via git's `credential.helper` support, but failed
Caused by: failed to acquire username/password from local configuration
error: could not write production lockfile for project
Caused by:
failed to generate lockfile
対応方法
- git credential.helper を設定する
.gitconfig に以下のような設定を追加することになる
[credential]
helper = store --file ~/.git-credentials
helper = cache --timeout 30000
自分は GitHub CLI を使って認証の管理をしているので、この設定をいれたあとに gh auth refresh
したら設定通りにキャッシュされた。
キャッシュされたら rye lock が通った。
参考
認証情報のキャッシュ方法が記載されていて参考になったのでまずはこちらのドキュメントを読んだうえで設定をしてみるのが良いかと思うtox 公式が tox-uv を出してる。
tox を使っているリポジトリは tox をアンインストールして、tox-uv をインストールすると切り替えられる。
【解決】Rye uv で GitHub リポジトリからの依存が pip install するときにバージョンコンフリクトを起こす
Rye 0.29.0 (uv 0.1.17) で Git 依存のコンフリクト問題は解消されました。
uv 0.1.17 以降では lock ファイルは変わらず commit hash になりますが、dependencies に @develop、lock ファイルに commit hash が指定されていた場合、
uv は commit hash を @develop のより正確な値であると仮定して処理することで、コンフリクトエラーを出さないようなりました。
詳細は
-
https://github.com/astral-sh/uv/releases/tag/0.1.17
- Allow more-precise Git URLs to override less-precise Git URLs (#2285)
前提
- Rye で uv を使ってる
問題
❯ rye run tox -e py311
py311: venv> .venv/bin/uv venv -p 3.11 /Users/zztkm/dev/github.com/zztkm/hello-git-uv/.tox/py311/.venv
py311: install_deps> .venv/bin/uv pip install -r requirements-dev.lock
Built file:///Users/ttsuruta/dev/github.com/zztkm/hello-git-uv Built 1 editable in 341ms
error: Requirements contain conflicting URLs for package `hello-git-uv`:
- git+https://github.com/zztkm/hello-git-uv@03d18dc51cf22e2f6ccf1637a2080de75d19ea7d
- git+https://github.com/zztkm/hello-git-uv@v0.1.0
py311: exit 2 (0.53 seconds) /Users/ttsuruta/dev/github.com/zztkm/hello-git-uv> .venv/bin/uv pip install -r requirements-dev.lock pid=77767
py311: FAIL code 2 (0.59 seconds)
evaluation failed :( (0.62 seconds)
推測
rye add するときは tag で指定していたが、lock ファイルでは commit に切り替わっていて、pyproject.toml に記載の依存関係とコンフリクトを起こしていそう。
困るパターン
- git 依存パッケージがさらに git 依存パッケージを持っている場合
どうするか?
- uv で commit ではなく指定したタグでロックできるようにしてもらえるか聞いてみる
- それまでは rye で uv を利用しないほうが良いかも
Rye とか uv とか使わずに pip でやってるプロジェクトで tox を利用してるなら、tox-uv 単体でも採用してみるのはありかも。
多分速度に感動して uv に切り替えたくなるかもだけど。
tox 公式が出しているという安心感もある。uv のバグを踏む可能性はあるのでそこは貢献のチャンスと思ってもらって。
既存の tox.ini を特にいじらずに、tox をアンインストールして tox-uv をインストールすれば導入完了した。
sounddevice を Rye uv で install したときの問題
※ 深掘りしていないので、推測が含まれます。
uv 有効化状態で、sounddevice をインストールしてスクリプトを実行しようとしたときに以下のエラーが発生した。
その後、uv を無効化し、pip でインストールしたところ問題が解消した。
$ rye run media_recvonly
Traceback (most recent call last):
File "C:\Users\takum\dev\github.com\shiguredo\sora-python-sdk-samples\.venv\lib\site-packages\sounddevice.py", line 71, in <module>
raise OSError('PortAudio library not found')
OSError: PortAudio library not found
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\takum\.rye\py\cpython@3.8.18\install\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\takum\.rye\py\cpython@3.8.18\install\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\takum\dev\github.com\shiguredo\sora-python-sdk-samples\.venv\Scripts\media_recvonly.exe\__main__.py", line 5, in <module>
File "C:\Users\takum\dev\github.com\shiguredo\sora-python-sdk-samples\src\media\recvonly.py", line 9, in <module>
import sounddevice
File "C:\Users\takum\dev\github.com\shiguredo\sora-python-sdk-samples\.venv\lib\site-packages\sounddevice.py", line 80, in <module>
import _sounddevice_data
ModuleNotFoundError: No module named '_sounddevice_data'
uv 無効化
$ rye config --set-bool behavior.use-uv=false
$ rye sync -f
# このあとは問題なかった。
調査
.venv の site-packages 配下を見ると、uv のときは _sounddevice_data がなくて、pip のときにはあることがわかった。どうやらこのディレクトリに portaudio ライブラリがインストールされるっぽい。
なんで uv だと _sounddevice_data が作られないかまではわかっていないので、Rye を利用せずに uv だけで試してみて、uv と pip のインストールされる状態の違いを issue で報告するだけしてみるか。
Scrap だと見出しがなくて気になるトピックに飛びづらいので更新前提ではあるが、Rye uv の記事書こうかな。
Rye 内臓の lint, fmt コマンドについて。
Rye 内臓の Ruff のバージョンは、固定されているので、Rye のバージョンアップごとにしかバージョンアップされない。
また、Ruff はまだ安定版ではないので、Ruff のバージョンアップによっては ruff format の結果が変わることもある(フォーマットが変わったこと自体は検知できるし特に問題ないとは思うけど)。
複数人で開発している場合など以下のケースで困ることがあると思った。
- Rye のバージョンは開発者に依存し、プロジェクト設定で強制することができないので、別々のフォーマットが並行して適用されると混乱の種になる
- Rye のバージョンアップ時に Ruff のバージョンも上がることがあるので、良きせぬフォーマット変更が入る(許容できるかもしれないが
- Ruff の最新が出たときに、Rye のバージョンアップを待つことになる
というのもあり、個人的には Ruff のバージョンは rye.dev-dependencies と lock ファイルで管理して、rye fmt は使わずに、rye run ruff format するとか、makefile に fmt を追加して make fmt するとか、tool.rye.scripts に fmt = "ruff format" を定義すると良いと思ってる。
rye test も同様。
まあ、基本 pytest とか Ruff とかのバージョンを自分であげていくモチベーションがある人もそんなにいないので、rye self update したら勝手にバージョンが上がってくれるのはメリットでもあるかも?
TODO: Rye (uv) で相対パスでローカルのパッケージをインストールする方法をまとめる
これは記事にしてここにリンク残す感じにするか。
self update
self update できるようになってる
uv self update
releases を眺めてたけど、今は pip にある option のサポートをメインで進めてる感じなのかな。
Rye を置き換えられるのはまだ先になりそうだけど、開発自体はめちゃくちゃ進んでるのでそう遠い話ではないかもしれない。楽しみ