【python】pyinstallerでエラー(selenium,ezsheet,Googleスプレッドシート)
「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
※すべて自己責任でお願いします。
ディスカッション
コメント一覧
まだ、コメントがありません