📑

Python 3.13リリースに伴うpip installのエラーとその解決策

2024/10/08に公開

問題の概要(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で以下の変更が行われました:

  1. ビルド要件の変更:Python 3.13では、C11アトミックライブラリ、GCCのビルトインアトミック関数、またはMSVCのインターロック組み込み関数をサポートするコンパイラが必要になりました。
  2. 内部実装の変更:これらの新しいコンパイラ要件により、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を使用し続けることで安定した開発環境を維持しつつ、定期的に最新の状況を確認することをおすすめします。

参考リンク

関連書籍

入門 Python 3 第2版

Discussion