Ryeを使っていると uv venv が動かない

Ryeを使っている状態で uv venv をすると、次のようなエラーになります。

$ uv venv
  × Querying Python at `/Users/inada-n/.rye/shims/rye` failed with status exit status: 2:
  │ --- stdout:

  │ --- stderr:
  │ error: unexpected argument found
  │ ---

pythonpython3 コマンドが rye コマンドのシンボリックリンクになっていて、ryeはpythonとして起動された場合は .python-version などのルールに従って決めたバージョンのPythonを起動するようになっています。ちなみに +3.8 みたいにしてバージョンを指定することもできます。

$ python3 +3.8 -msite
sys.path = [
    '/Users/inada-n/tmp',
    '/Users/inada-n/.rye/py/cpython@3.8.18/install/lib/python38.zip',
    '/Users/inada-n/.rye/py/cpython@3.8.18/install/lib/python3.8',
    '/Users/inada-n/.rye/py/cpython@3.8.18/install/lib/python3.8/lib-dynload',
    '/Users/inada-n/.rye/py/cpython@3.8.18/install/lib/python3.8/site-packages',
]
USER_BASE: '/Users/inada-n/.local' (exists)
USER_SITE: '/Users/inada-n/.local/lib/python3.8/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

しかし、 uv venv はデフォルトのPythonを利用するときに python3 コマンドを PATH から見つけた後、シンボリックリンクを解決してから実行してしまいます。python3のシンボリックリンクを解決するとryeになるので、ryeをryeとして起動してしまい、pythonを実行することができません。

UV venv doesn't work on MacOS when Rye is installed · Issue #1791 · astral-sh/uv · GitHub

将来的には解決されるでしょうが、とりあえずの回避策を紹介しておきます。 rye は自身のテストを実行するときに複数バージョンのPythonをあるディレクトリ以下にダウンロードして使っていて、そのディレクトリを UV_TEST_PYTHON_PATH という環境変数で指定しています。

これを利用して、 $HOME/pythons というディレクトリに rye が持っているPythonのpython3.xコマンドへのシンボリックリンクを集めて、UV_TEST_PYTHON_PATHにそのディレクトリを設定してやります。そしてデフォルトで使いたいバージョンに python3 というシンボリックリンクも作っておきます。

$ mkdir pythons
$ cd pythons
$ for i in ~/.rye/py/*/install/bin/python3.*; do ln -s $i; done
$ ln -s python3.12 python3
$ ln -s python3.12 python
$ cd

$ export UV_TEST_PYTHON_PATH=$HOME/pythons

$ uv venv hoge
Using Python 3.12.1 interpreter at /Users/inada-n/.rye/py/cpython@3.12.1/install/bin/python3.12
Creating virtualenv at: hoge

$ uv venv -p3.8 hoge
Using Python 3.8.18 interpreter at /Users/inada-n/pythons/python3.8
Creating virtualenv at: hoge

このように uv venv が動くようになるだけでなく、 uv venv -p3.x で rye が管理しているインタープリタを利用できるようになりました。 上のコマンドはすごく雑なやり方で、 3.12.03.12.1 のようにマイクロバージョン違いのバージョンが複数ある場合はどれが利用されるかわからないので、その場合は手作業で修正してください。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。