【python】pyinstallerでエラー(selenium,ezsheet,Googleスプレッドシート)

2021年8月11日

no suitable image found」「No module named」「UnknownApiNameOrVersion」「name: sheets  version: v4」「failed to get the Python codec of the filesystem encoding」など、Macでpyinstallerを使用時に発生したエラーを解決した方法の記録を残します。

作成したい実行ファイル

pythonの内容は、

  • 「ezsheet」でURLリストが記載されているスプレッドシートからURLを読み込み、
  • 「selenium」でGoogle Chromeでアクセス、
  • chrome上でアクションできたらスプレッドシートに記録を取る

pyinstallerを実行してみた

pyinstaller main.py 

実行ファイルが完成したので実行するとエラーが発生するので色々解決した。

No module named ' '

ModuleNotFoundError: No module named 'apiclient'

「No module named」は「specファイル」の「hiddenimports」に追記することでエラー回避ができるのでmain.specを下記のとおりに変更

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['main.py'],
             pathex=['/Users/user/Desktop/***'],
             binaries=[],
             datas=[],
             hiddenimports=['apiclient'],
             hookspath=[],
             runtime_hooks=[],
  ・
  ・
  ・

下記を実行する。指定するファイルが「main.spec」になっているので注意

pyinstaller main.spec

実行して見ると、「No module named」のエラーはなくなったが新しいエラーが発生している

UnknownApiNameOrVersion: name: sheets  version: v4

Traceback (most recent call last):
  File "main.py", line 8, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller/loader/pyimod03_importers.py", line 540, in exec_module
  File "sendForm.py", line 19, in <module>
  File "sendForm.py", line 37, in Set
  File "ezsheets/__init__.py", line 183, in __init__
  File "ezsheets/__init__.py", line 1693, in init
  File "googleapiclient/_helpers.py", line 131, in positional_wrapper
  File "googleapiclient/discovery.py", line 282, in build
  File "googleapiclient/discovery.py", line 398, in _retrieve_discovery_doc
googleapiclient.errors.UnknownApiNameOrVersion: name: sheets  version: v4
[55694] Failed to execute script main
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

googleapiclientが原因。specファイルを下記のようにすることで改善

# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_data_files

block_cipher = None


a = Analysis(['main.py'],
             pathex=['/Users/user/Desktop/form'],
             binaries=[],
             datas=collect_data_files("googleapiclient"),
             hiddenimports=['apiclient'],
             hookspath=[],
             runtime_hooks=[],
  ・
  ・
  ・

下記を実行してみる

pyinstaller main.spec

新しいエラーが発生

No such file or directory:

FileNotFoundError: [Errno 2] No such file or directory: './driver/chromedriver'

seleniumで使用するchromeドライバのpathを指定していると思います。
そこでエラーが出ているようです。

chromeドライバも実行ファイルに同梱すれば解決するので、specファイルを下記のとおりにします。


a = Analysis(['main.py'],
             pathex=['/Users/user/Desktop/'],
             binaries=[('./driver/chromedriver','./driver')],

また、pythonファイル内でのpathの変更をする必要があるので下記の通り変更します。

chromeDriverPath='./driver/chromedriver'

ドライバーを上記のように指定していると思いますが、

def resource_path(relative_path):
        try:
            base_path = sys._MEIPASS
        except Exception:
            base_path = os.path.dirname(__file__)
        return os.path.join(base_path, relative_path)

chromeDriverPath=resource_path('./driver/chromedriver')

このように変更します。

これで無事に実行ファイルが完成すると思います。

no suitable image found

エラーの原因はわかりませんが、pythonとpyinstallerを再インストールすることで解決しました。

pip3 uninstall pyinstaller
brew reinstall python
brew install pyinstaller

Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding

実行時に下記のエラーが発生。pyinstallerの不具合らしい。

Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
LookupError: unknown encoding: utf-8

このコマンドで再インストールすることで改善した。

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip

※すべて自己責任でお願いします。

python

Posted by Next-k