Skip to content

protobuf エラー「Descriptors cannot not be created directly」の解決方法

問題の説明

TensorFlow、Ray、Kerasなどのライブラリを使用する際に、以下のエラーが発生することがあります:

python
TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
 1. Downgrade the protobuf package to 3.20.x or lower.
 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

このエラーは、Googleが開発したデータシリアライゼーション形式であるProtocol Buffers(protobuf)のバージョン互換性の問題によって発生します。特に、protobuf 4.x バージョンと、それに対応していないライブラリ間で発生することが多いです。

主な解決方法

方法1: protobufのバージョンダウングレード

最も効果的で一般的な解決策は、protobufを互換性のあるバージョンにダウングレードすることです:

bash
pip install "protobuf<4.0.0"

より具体的なバージョンを指定する場合:

bash
pip install protobuf==3.20.*

強制再インストールが必要な場合:

bash
pip install 'protobuf==3.20.1' --force-reinstall

TIP

requirements.txtファイルを使用している場合は、ファイルの最後に以下の行を追加してください:

protobuf==3.20.*

方法2: 関連ライブラリの更新

protobufに依存するライブラリを最新バージョンに更新することで解決する場合もあります:

bash
# TensorFlowの場合
pip install --upgrade tensorflow

# または特定のバージョンを指定
pip install tensorflow==2.12.0

# wandbの場合
pip install --upgrade wandb

# streamlitの場合  
pip install --upgrade streamlit

方法3: 環境変数の設定(非推奨)

パフォーマンスが低下しますが、暫時的な解決策として環境変数を設定する方法もあります:

bash
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python

Windowsの場合は:

cmd
set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python

注意

この方法は純粋なPythonパーサーを使用するため、処理速度が著しく低下する可能性があります。あくまで一時的な解決策としてご利用ください。

問題の根本原因

このエラーは、以下のような状況で発生します:

  1. バージョンの不一致: protobuf 4.x と、それに対応していない古いライブラリの組み合わせ
  2. 依存関係の競合: 複数のパッケージが異なるバージョンのprotobufに依存している
  3. 生成コードの古さ: _pb2.pyファイルが古いprotocコンパイラで生成されている

詳細なトラブルシューティング

依存関係の確認

現在インストールされているprotobufのバージョンを確認:

bash
pip show protobuf

すべての依存関係を確認:

bash
pip freeze | grep proto

仮想環境の確認

仮想環境を使用している場合、正しい環境にパッケージがインストールされているか確認してください。場合によっては、管理者権限でIDEを実行する必要があることもあります。

Conda環境での解決策

Condaを使用している場合:

bash
pip uninstall protobuf
conda install 'protobuf=3.20.1'

予防策

  1. バージョンの固定: requirements.txtで特定のprotobufバージョンを明示的に指定する
  2. 定期的な更新: 依存ライブラリを定期的に更新し、互換性問題を予防する
  3. 仮想環境の使用: プロジェクトごとに独立した仮想環境を使用する

まとめ

「Descriptors cannot not be created directly」エラーは、主にprotobufのバージョン互換性の問題で発生します。最も確実な解決方法は、protobufを3.20.x系のバージョンにダウングレードすることです。関連ライブラリを更新するか、一時的な対策として環境変数を設定する方法もあります。

プロダクション環境では、パフォーマンスへの影響を考慮し、バージョンのダウングレードまたはライブラリの更新を推奨します。