📑
Python 3.13リリースに伴うpip installのエラーとその解決策
問題の概要(error: subprocess-exited-with-error)
docker compose build
コマンドを実行した際に、以下のような pip install
エラーが発生するようになりました:
Collecting tokenizers>=0.13.0 (from anthropic->-r requirements.txt (line 3))
Downloading tokenizers-0.20.0.tar.gz (337 kB)
Installing build dependencies: started
Installing build dependencies: finished with status 'done'
Getting requirements to build wheel: started
Getting requirements to build wheel: finished with status 'done'
Preparing metadata (pyproject.toml): started
Preparing metadata (pyproject.toml): finished with status 'error'
error: subprocess-exited-with-error
× Preparing metadata (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [6 lines of output]
Cargo, the Rust package manager, is not installed or is not on PATH.
This package requires Rust and Cargo to compile extensions. Install it through
the system's package manager or via https://rustup.rs/
Checking for Rust toolchain....
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
原因
この問題は2024/10/07にリリースされたばかりのPython 3.13に関連しているようです。
Python 3.13では一部のビルドシステムに変更があり、特にRustで書かれた拡張機能を持つパッケージ(この場合はtokenizers
)に影響が出ているようです。
具体的には、Python 3.13で以下の変更が行われました:
- ビルド要件の変更:Python 3.13では、C11アトミックライブラリ、GCCのビルトインアトミック関数、またはMSVCのインターロック組み込み関数をサポートするコンパイラが必要になりました。
- 内部実装の変更:これらの新しいコンパイラ要件により、Pythonの内部実装が変更され、一部のパッケージのビルドプロセスに影響を与えています。
これらの変更により、tokenizers
のようなRustで書かれた拡張機能を持つパッケージが、新しいPythonバージョンでのビルドに問題を抱えている可能性があります。
パッケージのメンテナーがこれらの変更に対応するまでの間、pip installでエラーが発生する可能性があります。
詳細: Python 3.13の新機能
解決策
とりあえずの対応
Dockerfileで使用するPythonのバージョンを明示的に3.12に固定することで、問題が解消します。
例えば:
FROM python:3.12
# 以下、Dockerfileの残りの部分
結論
この問題は、新しいPythonバージョンがリリースされた後によく見られる一時的な互換性の問題のようです。時間が経てば、多くのパッケージがアップデートされ、Python 3.13でも問題なく動作するようになるはずです。
当面はPython 3.12を使用し続けることで安定した開発環境を維持しつつ、定期的に最新の状況を確認することをおすすめします。
Discussion