Pythonのスクリプトをexeファイルに変換したが実行できない!(ModuleNotFoundError)
Pythonのファイルをexeファイルに変換し、いざ実行してみたら「ModuleNotFoundError: No module named 'tweepy'」
(=tweepy というモジュールが見つからない)
というエラーが出てきちんと実行されなかった。
いろいろ調べて何とか解決したので、そのやり方を備忘録として書いておく。
≪実行環境≫
・Windows10
・Python3.11
・PyCharm 2022.2.4
なおexeファイルに変換しようと思ったのは、自作のPythonのファイルをWindowsで自動実行するため。
当初はexeファイルの変換せずに python コマンドにファイル名を渡して直接pyファイルを実行するつもりだったが、これはこれでPathを通す等の作業でいろいろ躓いた。
そこで一度exeファイルに変換した方が自動実行しやすいだろうということで、exeファイルに変換することにした次第。
Pythonスクリプトのexeファイルへの変換の仕方①
やり方は多分複数あるのだろうが、PyInstallerを使うのが一般的な様子なので、PyInstallerを使用。
ただ、いきなりうまく行ったわけではなく以下のケースで失敗した。
- PyCharmの仮想環境内でPyInstallerをインストール → 理由は不明だがPyCharmのコマンドライン(Alt+F12)からPyInstallerを実行してもPyInstallerが認識されない
- WindowsのコマンドプロンプトからpipコマンドでPyInstallerをインストール。同じくコマンドラインからスクリプトをexeファイルに変換したが、"No module named ○○"(=「○○というモジュールが見つからない」)というエラーメッセージが出て実行できない
Pythonスクリプトのexeファイルへの変換の仕方②
最終的にうまく行ったのは以下のやり方です。
1.WindowsのコマンドラインからPyInstallerをインストール
pip install pyinstaller
管理者権限ではなく、普通にインストール。
例えば python.exe が以下のフォルダ(USER_NAME はWindowsの各ユーザーの名前)にインストールされている場合(※)
C:\Users\USER_NAME\AppData\Local\Programs\Python\Python311
PyInstallerは
C:\Users\USER_NAME\AppData\Local\Programs\Python\Python311\Scripts(\pyinstaller.exe)
にインストールされる。
(※何も指定しないでPythonをインストールした場合、Pythonはこのフォルダにインストールされる様子)
2.PyCharmからコマンドラインを立ち上げて(Alt+F12)、PyInstallerを実行する。
この際、変換したいpyファイルを含むプロジェクトを立ち上げて、PyInstallerを実行する。
基本はこんな感じ(↓)なのだが、この場合、exeファイルはできあがったが、冒頭に実行時に書いたエラー(ModuleNotFoundError)が出て、うまく実行できなかった。
pyinstaller H:\PROJECT_NAME\main.py --onefile
(なお「--onefile」 は外部パッケージも含めて1つの実行ファイルにまとめるための引数。一つの実行ファイルにすべてをまとめた方がPath等の面倒な問題を回避できるので、基本的には「--onefile」を付けて実行した方がいいと個人的には思う)
調べてみたわかったことは以下の通り。
- 別途インストールしたようなモジュールを使っている場合、pyinstaller では自動で認識できないことある様子
- スクリプトと同じフォルダに自動的に作られる *****.spec というファイル内に使いたいモジュールの名前を記載する(「*****」の箇所はEXE化したいファイルの名前が入る)
- ただ使いたいモジュールのpathが通っていないと②だけではうまく行かないので、PyInstallerの実行時にPathを指定してやる必要がある
②だが例えば外部モジュールであるtweepyをインポートしたい場合はspecファイルの hiddenimportsの箇所に以下のように記載する。
インポートするモジュールが複数ある場合は、併記すればよい。
hiddenimports=['tweepy']
③だが、
pyinstaller --paths H:\PROJECT_NAME\venv\Lib\site-packages --hidden-import tweepy H:\PROJECT_NAME\main.py --onefile
という感じで、
- --paths で使いたいモジュールが入っているフォルダを指定(※)
- --hidden-import オプションで使いたいモジュール名を指定
とやったら、正しく動作する実行ファイルが作成された。
(「--hidden-import」でモジュール名を指定しているので、もしかしたらspecファイルをイジる必要はない?)
(※この場合、「site-packages」というフォルダの下に「tweepy」というフォルダがあり、tweepyの本体はそこに入っている)
なお出来上がった実行ファイルは
H:\Python_Codes\ProjectName\dist
というフォルダに保存される。
以上です。
【参考】
【Pyinstaller】Python exe化する方法 エラー対策あり!
【図で説明】Pythonにファイルを指定して実行する時のルール、フォルダ構成など
No module named when using PyInstaller