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 │ ---
python
や python3
コマンドが 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.0
と 3.12.1
のようにマイクロバージョン違いのバージョンが複数ある場合はどれが利用されるかわからないので、その場合は手作業で修正してください。