Python

【Pyinstaller】Pythonのスクリプトをexeファイルに変換する方法


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」を付けて実行した方がいいと個人的には思う)

 

調べてみたわかったことは以下の通り。

  1. 別途インストールしたようなモジュールを使っている場合、pyinstaller では自動で認識できないことある様子
  2. スクリプトと同じフォルダに自動的に作られる *****.spec というファイル内に使いたいモジュールの名前を記載する(「*****」の箇所はEXE化したいファイルの名前が入る)
  3. ただ使いたいモジュールの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