googleapiclientを使うプログラムでPyInstallerするとエラーがでた話


問題

Google Api(スプレッドシート)を使うプログラムをPyInstallerで実行ファイル化しようとしたら,コンパイルはできたが実行時にエラーが発生.
コンパイルしたプログラムは以下のようなもの

main.py
from googleapiclient.discovery import build
# 以下略

ここで,

pyinstaller --onefile main.py
./dist/main # コンパイルに成功し,実行ファイルができる

さて,実行ファイルを実行すると,

pkg_resources.DistributionNotFound: The 'google-api-python-client' distribution was not found and is required by the application

解決方法

google-api-clientのバージョンを1.8.0にする.
要は以下を実行すれば良い.

pip install google-api-python-client==1.8.0

なんと画期的な解決方法でしょう!!!!

詳細

参考程度ですが,実行環境は

  • OS: Raspbian GNU/Linux 10 (buster)
  • Python 3.7.3
  • PyInstaller 4.0

おわりに

google-could-visionやFirestoreを使う場合類似したエラーについて書かれた記事を見かけたがあまり参考にならなかった.いずれの例でもpkg_resources.DistributionNotFoundに遭遇しているため同様の解決方法で行けるかと思ったが全然できずに時間が溶けました.
結局,google-api-clientのgithubのissueの議論で解決した.
PyInstallerの代替としてcx_Freezeなどでも試してみたが結局できなかった.
この問題がいつまで発生(PyInstaller/Googleが対応するまで?)するか分かりませんし,いつまでこの方法で解決するかもわからないので参考程度にしてください.また,この環境でしか試していないため,他の環境でも同様のエラーが出るかは不明です.
PythonもGolangのように公式で(クロスプラットフォームな)実行ファイル化するような方法を確立してほしいと思いました.