Pythonで作ったプログラムを実行するには、Pythonそのものを実機にインストールする必要があります。
また、pandas や numpyなどのパッケージを使っている場合、それらも同時にインストールしなければなりません。
全くPythonが入っていないPCで動かすとなると、このインストール作業って面倒ですよね。
ましてや動作させるPCの台数が多かった場合、それだけで大変です。
その解決策として、Pythonプログラムの動作に必要な環境をひとまとめにして、単一のEXEファイルにしてしまう「pyinstaller」について紹介します。
簡単にEXE化できでしまうので、是非お試し下さい。
Pyinstaller のインストール
python 公式サイトでPythonをインストールしている方は、コマンドプロンプトやPythonプロンプトから、次のコマンドを実行します。
pip install pyinstaller
Anaconda 又は Miniconda を使ってPythonをインストールされた方は、コマンドプロンプト又はAnacondaプロンプトから、次のコマンドを実行します。
conda install pyinstaller
いずれの場合も、管理者として実行したプロンプトからコマンドを実行しないと、書き込み権限不足でうまくインストールできない場合があるのでご注意ください。
EXE化の方法
最初に、DOSプロンプト(Anacondaプロンプト、PythonプロンプトでもOK)を起動します。
次に、EXE化したいファイルが置かれている場所にカレントディレクトリを移動します。
その状態で次のコマンドを実行します。
pyinstaller ファイル名 --onefile
例えば、hoge フォルダにある myprogram.py を EXE化したい場合は次の様にします。
cd hoge
pyinstaller myprogram.py --onefile
コマンドを実行すると、カレントディレクトリに3つのフォルダと拡張子 .spec のファイルが自動生成されます。
そして、EXEファイルは dist フォルダ内に作成されています。
起動時の主なオプションは次の通りです。
オプション | 説明 |
---|---|
--onedir 又は -D--clean | 出力を1ディレクトリにまとめる |
--onefile 又は -F | 出力を1ファイルにまとめる |
--noconsole 又は -w | コンソール画面を非表示にする |
--clean | 前回のキャッシュと出力ディレクトリを削除する |
--name 又は -n | .spec ファイルを指定したパスと名前で作成する |
--exclude ライブラリ 名 | 除外 したい ライブラリ(パッケージ)を指定する |
--hidden-import ライブラリ 名 | 同梱 したい ライブラリ(パッケージ)を指定する |
--add-data "参照先パス ; 保存先 フォルダ " | 同梱 したい データを指定する |
--add-binary "参照先パス ; 保存先フォルダ" | 同梱したいバイナリファイル(ドライバ等)を指定する |
任意のファイルを同梱したい場合
--add-data は CSVやSQLiteのデータベース等、EXE化に含ませたい(同梱したい)ファイルを指定し、
--add-binary はPythonでimport されないライブラリやバイナリファイル(ドライバ類)を同梱する時に指定します。
指定方法はどちらも "参照先パス;保存先フォルダ” を指定します。
例えば、./driver/chromedriver.drv というファイルを参照するPythonプログラムをEXE化した場合、実行時も同じフォルダ階層に chromedriver.drv を置かないと参照できません。
”参照先パス;保存先フォルダ" の「参照先パス」は、同梱対象のファイルが置かれているパスを指定し、「保存先フォルダ」にはEXE実行時における参照先フォルダを指定します。
pyinstaller myprogram.py --onefile --add-binary ".\driver\chromedriver.drv;.\driver"
図で表現すると以下の様になります。
コンソール画面を非表示にしたい場合
通常、Pythonプログラムを実行中は、コンソール画面が表示されます。これを非表示にしたい場合、--noconsole を指定します。
ただし、これを指定するとPythonが実行中に出力される情報(例えば処理の進捗状況をprint出力している場合)が一切表示されなくなるので、ご注意ください。
pyinstaller myprogram.py --onefile --noconsole
EXE化の注意点
pyinstaller でEXE化に成功しても、必ず別のPCで実行できるという訳ではなく、エラーが発生する場合があります。
また、EXEしたのは良いが、巨大なEXEが出来上がってしまう場合もあります。
ここでは、pyinstaller を使う上で注意すべき点について解説します。
絶対パスで参照している箇所は要注意
pyinstaller でEXEを作成する目的は、作ったプログラムを別のPCで実行したいからです。
pyinstaller はPythonファイルやパッケージの依存関係を解析してはくれますが、100% ではありません。
例えば、import しているライブラリから更に別のライブラリをimport していたり、絶対又は相対パスで何らかのファイルを参照している場合がそのケースです。
特に作成時と実行時のフォルダ構成が異なる場合はうまくいかないことが多いので、実行時にエラーが発生した場合はまず最初にこれを疑いましょう。
対策としては、--add-data や --add-binaryなどでデータやライブラリの置き場所を明示的に指定するとともに、そこを正しく参照するよう Python プログラムを修正します。
容量が巨大になりがち
pyinstaller で作成されたEXEファイルは、 Pythonのソースコード上でimport されているライブラリだけでなく、python 環境そのものにインストール済みのパッケージも含めてEXE化しようとします。
つまり、今までに conda install や pip install でインストールしたパッケージが多いほど、出来上がるEXEファイルが巨大化します。
これを避けるためには、 --exclude オプションで使わないライブラリを指定するか、あるいは仮想環境で必要なライブラリをインストールし、その環境下で pyinstaller を実行するようにします。
複数のファイルをEXE化するときは main.py を指定する
複数のファイルで構成されたプログラムをまとめてEXE化したい場合、メインとなるpython プログラムを指定するだけでOKです。
例えば main.py がメインとなるプログラムであるなら、main.py を指定するだけで pyinstaller は呼び出し先をたぐって必要なモジュールを集めてくれます。
しかし、もし参照が複雑でうまくEXE化が出来ない、あるいはEXEは出来たが実行時にエラーになる場合は、必要なライブラリが参照できていないことを疑いましょう。
仕組み
ここでは、Pyinstaller の仕組みを簡単にご紹介しておきます。
まず、EXEファイル作成時ですが、指定したプログラムファイルの内容から依存関係のあるファイルを洗い出し、1つのフォルダ又はファイルに纏めます。
例えば、オプションに --onefile を指定した場合、下図のように単一ファイルが作成されます。
実行したいパソコンにコピーしEXEを実行すると、ユーザーフォルダのテンポラリフォルダ配下に一時フォルダ(ランダムな英数字で構成されたフォルダ名)を作成し、EXEファイルの中身を展開します。
この処理によりPythonプログラムの実行環境が整いますので、続けて自作プログラムが実行されます。
この工程があるため、Pyinstallerで作成したEXEファイルを実行する際、若干のオーバーヘッドが生じてしまいます。
ちなみに、自作プログラムが終了すると、この一時フォルダは削除されますので、EXEファイルを実行する度、毎回オーバーヘッドが生じます。
もし出来上がったEXEファイルがうまく動作しない場合は、このTempフォルダ配下に作られた一時フォルダの中身を見て、必要なファイルが揃っているか、フォルダ階層は想定された状態になっているかを確認しましょう。
まとめ
今回はpyinstaller を使った EXE化について解説しました。
pyinstaller を使うと簡単にPython環境と必要なライブラリを同梱したEXEファイルが作成できます。
自作PythonプログラムをPython実行環境がインストールされていない環境で動かしたい場合、しかも複数のPCで実行したい場合は非常に便利です。
プログラムの中から特定のフォルダにあるファイルを参照するような場合や、依存関係が複雑な場合は、出来上がったEXEがうまく動かないことがありますが、pyinstaller のオプションを適切に使うことで解決出来ます。
皆さんが pyinstaller を使う上での参考になれば幸いです。
コメント