ProtocolBufferを利用時ModuleNotFoundError: No module named 'google'が出たときの対処法

公開日:
更新日:
目次

PythonでProtocolBufferを利用しようとした際に、以下のエラーメッセージに遭遇した経験がある方もいるかもしれません。

ModuleNotFoundError: No module named 'google'

google というモジュール名を見て「Google系のSDKを入れればいいのか」と思いがちですが、実際には ProtocolBuffer 用のライブラリ protobuf が入っていない(あるいは正しい環境に入っていない)ことが原因です。備忘録として、よく踏むパターンと対処法をまとめます。

なぜ「google」というモジュール名で出るのか

protobuf をインストールすると、Python から見たときの import パスは from google.protobuf import ... の形になります。これは protobufgoogle という名前空間パッケージ(namespace package)の下にぶら下がっている構造で、grpcgoogle-cloud-*google-api-core などの Google 系ライブラリも同じ google 名前空間を共有しています。

そのため、protobuf が入っていない環境では import 段階で google 自体が見つからず、ModuleNotFoundError: No module named 'google' という一見ミスリードなメッセージが出ます。google という名前のパッケージを pip install google してしまうと、まったく別物(しかも非推奨の古いライブラリ)が入るので注意してください。

protobufライブラリのインストール

まずはPythonのパッケージマネージャー「pip」で protobuf をインストールします。ターミナルまたはコマンドプロンプトで以下を実行してください。

pip install protobuf

インストールが完了したら、Pythonスクリプトを再度実行します。多くの場合はこれだけで解決します。

仮想環境とPythonバージョンを確認する

それでも解消しない場合、ほぼ仮想環境周りの不一致が原因です。

仮想環境(venv / virtualenv / Poetry / uv 等)を使っているなら、その環境をアクティブにした状態で pip install できているかを確認してください。シェルでアクティベートし忘れたまま pip を叩くと、グローバル側に入って肝心のスクリプト実行環境には届きません。複数バージョンの Python が同居している場合は、明示的に python -m pip install protobuf の形で「いま使っている Python」に紐付けて入れるのが安全です。

python -m pip install protobuf
python -c "from google.protobuf import __version__; print(__version__)"

公式の対応バージョンとしては、protobuf Python 5.x 以降が Python 3.10〜3.14 をサポートしています[1]。Python 3.12 以降に上げたタイミングで古い protobuf 3.x 系のままだと、メタクラス周りで TypeError: Metaclasses with custom tp_new are not supported が出ることがあります[2]。古いプロジェクトを移行するときは合わせて protobuf も上げてください。

grpcio-tools や Google Cloud 系と併用するときの落とし穴

google 名前空間を共有する周辺ライブラリ(grpcio-tools / google-cloud-* / google-api-core / proto-plus など)と同居する環境では、protobuf 単独で入れても、後から別パッケージを入れた瞬間に protobuf がダウングレードされて挙動が変わることがあります。grpcio-tools 1.71 系と protobuf 6.30 系の組み合わせのように、メジャーバージョンの食い違いで衝突するケースも報告されています[3]

このタイプは「protobuf だけ上げる」のではなく、pip install 'protobuf>=5,<6' 'grpcio-tools>=1.66' のように 同時にバージョン範囲を指定して入れ直す と解消しやすいです。pip install pipdeptree && pipdeptree -p protobuf で依存元を可視化してから揃えると見通しがよくなります。

condaやシステムPythonでハマるケース

Anaconda/Miniconda 環境で pip install protobuf した後にもエラーが続く場合は、conda install -c conda-forge protobuf で conda 側のチャネルから入れ直すと解消することがあります。conda 環境内で pip と conda の管理パッケージが衝突して、google/__init__.py が片方から見えなくなることが原因です。

macOS でシステム Python(/usr/bin/python3)に直接 pip install した場合も似たことが起きます。実際に動かしている Python の sys.path と、pip が書き込んだ site-packages の場所がずれていないか、python -c "import sys; print(sys.path)" で確認してください。

なお MIMEMultipart などメール系ライブラリと組み合わせるパイプラインでは、ProtocolBuffer 由来のエラーと別系統の AttributeError が混ざって出ることもあります。'NoneType' object has no attribute 'policy' のような email 側のエラーはこちらの記事で扱っているので、メッセージごとに切り分けてください。

脚注
  1. Version Support | Protocol Buffers Documentation (2026-05-26 アクセス) ↩︎

  2. Compiled Python extension does not work with Python 3.12 · Issue #12186 · protocolbuffers/protobuf (2026-05-26 アクセス) ↩︎

  3. Python dependency conflict protobuf==6.30.1 grpcio-tools==1.71.0 · Issue #39012 · grpc/grpc (2026-05-26 アクセス) ↩︎