【超簡単】Python プログラムを pyinstaller で EXE化しよう

当ページのリンクには広告が含まれています。

Pythonで作ったプログラムを実行するには、Pythonそのものを実機にインストールする必要があります。

また、pandas や numpyなどのパッケージを使っている場合、それらも同時にインストールしなければなりません。

全くPythonが入っていないPCで動かすとなると、このインストール作業って面倒ですよね。

ましてや動作させるPCの台数が多かった場合、それだけで大変です。

その解決策として、Pythonプログラムの動作に必要な環境をひとまとめにして、単一のEXEファイルにしてしまう「pyinstaller」について紹介します。

簡単にEXE化できでしまうので、是非お試し下さい。

目次

Pyinstaller のインストール

python 公式サイトでPythonをインストールしている方は、コマンドプロンプトやPythonプロンプトから、次のコマンドを実行します。

Anaconda 又は Miniconda を使ってPythonをインストールされた方は、コマンドプロンプト又はAnacondaプロンプトから、次のコマンドを実行します。

いずれの場合も、管理者として実行したプロンプトからコマンドを実行しないと、書き込み権限不足でうまくインストールできない場合があるのでご注意ください。

EXE化の方法

最初に、DOSプロンプト(Anacondaプロンプト、PythonプロンプトでもOK)を起動します。

次に、EXE化したいファイルが置かれている場所にカレントディレクトリを移動します。

その状態で次のコマンドを実行します。

  pyinstaller ファイル名 --onefile

例えば、hoge フォルダにある myprogram.py を EXE化したい場合は次の様にします。

コマンドを実行すると、カレントディレクトリに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実行時における参照先フォルダを指定します。

言葉で説明すると分かり難いので、図で表しておきます。

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 と同じ役割を持つメインのpython プログラムを引数に指定することで、自動的に必要なファイルを集めてくれます。

しかし、もし参照が複雑でうまく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 を使う上での参考になれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次