Python 3.13でpydantic-coreのインストールに失敗する問題と解決策
問題の概要
Python 3.13環境でpydantic
やfastapi
などの依存関係をインストールしようとすると、pydantic-core
のビルド時に以下のようなエラーが発生します:
Building wheel for pydantic-core (pyproject.toml) ... error
error: subprocess-exited-with-error
× Building wheel for pydantic-core (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [30 lines of output]
...
Traceback (most recent call last):
File ".../generate_self_schema.py", line 192, in eval_forward_ref
return type_._evaluate(core_schema.__dict__, None, set())
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: ForwardRef._evaluate() missing 1 required keyword-only argument: 'recursive_guard'
...
問題の原因
この問題は、Python 3.13でtyping.ForwardRef._evaluate()
メソッドの引数が変更されたことが原因です。Python 3.13では、recursive_guard
という新しい必須のキーワード引数が追加されましたが、pydantic-core
のビルドスクリプトはこの変更に対応していません。
具体的には、pydantic-core
のビルド時に実行されるgenerate_self_schema.py
スクリプトが、古い引数形式でForwardRef._evaluate()
を呼び出そうとしているため、エラーが発生しています。
解決策
この問題を解決するには、以下の方法があります:
方法1: Python 3.12を使用する(推奨)
Python 3.13はまだ新しいバージョンであり、多くのライブラリがまだ完全に対応していません。Python 3.12を使用することで、この問題を回避できます。
手順:
-
Python 3.12をインストールする(Macの場合):
brew install python@3.12
-
Python 3.12のシンボリックリンクを作成する:
brew link --overwrite python@3.12
-
パスを設定する:
echo 'export PATH="/usr/local/opt/python@3.12/libexec/bin:$PATH"' >> ~/.zshrc source ~/.zshrc
-
Python 3.12が使用されていることを確認する:
python --version # Python 3.12.x と表示されるはず python3 --version # Python 3.12.x と表示されるはず
-
新しい仮想環境を作成する:
python -m venv venv source venv/bin/activate
-
依存関係をインストールする:
pip install -r requirements.txt
方法2: pydanticの特定バージョンを使用する
将来的には、pydanticの開発者がPython 3.13に対応したバージョンをリリースする可能性があります。その場合は、以下のコマンドで最新バージョンをインストールできます:
pip install pydantic --upgrade
ただし、記事執筆時点では、Python 3.13に完全に対応したpydanticのバージョンはまだリリースされていません。
まとめ
Python 3.13はまだ新しいバージョンであり、一部のライブラリがまだ完全に対応していません。特にpydantic-core
のようなRustで書かれた拡張モジュールは、Python内部の変更に敏感です。
当面は、Python 3.12を使用することで、これらの互換性の問題を回避できます。Python 3.13への移行は、主要なライブラリがすべて対応した後に検討することをお勧めします。
この問題は、新しいPythonバージョンがリリースされた直後によく見られる現象です。時間が経つにつれて、ライブラリの開発者がコードを更新し、新しいPythonバージョンに対応していくでしょう。
Discussion