protobufのバージョンエラーが再発する

protobufでエラーになる

protobufのバージョンエラーが再発する

私は最近Dockerで開発を再開したのですが、pythonのエラーが多々発生したのでその解消方法を紹介したいと思います。


TypeError: Descriptors cannot not be created directly.

特に悩まされたのがprotobufです。
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).

エラー文言で検索をかけると、エラー文に表示されている通り、protobufのバージョンを下げたものを再インストールすることで解決したという記事が多く見つかります。

 pip install protobuf==3.20.1
しかし私の環境ではなぜか解決せず、、
正確に言うと解決したのですが、偶に再発することがあったのです。 色々調べると、他のライブラリなどをインストールした際に、protobufのバージョンが上がってしまっていることがあるようで、、その度にバージョンを下げてインストールし直しをする必要があるとのこと。

通常の環境であれば、「pip list」などで確認できるのですが、Dockerの場合はコンテナに入って確認するなど手間が多いです。
なので、Dockerfileの最後にprotobufをインストールするように書き換えておいて、意地でもバージョンを下げたもので環境構築できるように手当をしないといけないのです。。

 FROM python:3
 RUN pip install --upgrade pip

 RUN pip install -q xxxxx
 RUN pip install -q xxxxx          
 ・・・
 #インストール系の最後に記述すること
 RUN pip install -q protobuf==3.20.1 
 ・・・
 CMD ["xxxx"]


さいごに

今回はprotobufのバージョンエラーについて、稀に再発する事象の対応を紹介しました。
ついつい新しいライブラリをインストールする際には、Dockerfileの末尾に追加して行きたくなりますが、protobufだけは必ず末尾で実行するようにしてあげましょう。
実際これが普通なのかもしれないですが、困っている人は試してみてください。
今回はこの辺で、ではまた!

コメント

このブログの人気の投稿

PowerAppsで座席表を作成する

Power Automateでファイル名から拡張子を取得

Power AutomateでTeamsのキーワードをトリガーにする