リファクタリングをPythonで実践!基本手法とコード例・注意点まで
この記事ではexe化のメリットからPythonファイルをexe化するPyInstallerの使い方まで詳しく紹介します。ぜひ最後までご覧ください。
1.Pythonのexe化とは?
はじめにexe化とはなにか紹介します。
①exe化のメリット
exe化には何点かメリットがあります。特にメリットの大きい3点を確認してみましょう。
- PythonをインストールしていないPCでも実行できる
- ターミナルやシェルからでなく、ダブルクリック等で実行できる
- アイコンを設定できる。
順番に紹介します。
まず1点目の「PythonをインストールしていないPCでも実行できる」ですが、exe化する上で最大のメリットとなります。本来、PythonファイルはPythonの環境上でのみ実行できますが、exe化することで環境構築していないPC上でも実行可能です。
そのため、作成したPythonファイルを配布する際などに役に立ちます。
2点目の「ターミナルやシェルからでなく、ダブルクリック等で実行できる」ですが、Pythonの知識が無い方に配布した際に役に立ちます。
コマンドが分からなくても表示されたアイコンをクリック等決まった動作でプログラムを実行できるので、難しい操作を必要とせず実行可能です。
3点目の「アイコンを設定できる」ですが、本来プログラムファイルは全て拡張子を表すアイコンが表示されます。しかし、exe化することで好きなアイコンを設定でき、複数プログラムを作成した場合でも分類がしやすくなりますので活用しましょう。
②exe化で注意するべきこと
ここまではメリットを紹介してきましたが、注意すべき点も存在します。
特に注意すべきは以下の2点です。
- exeファイルを作成したOS上でしか実行できない
- 作成方法によってはファイルが重くなる
順番に説明します。
1点目の「exeファイルを作成したOS上でしか実行できない」ですが、windowsで作成したexeファイルはwindows上でのみ、MACで作成したexeファイルはMAC上でしか実行できません。
配布等を検討している場合、注意が必要です。
2点目の「作成方法によってはファイルが重くなる」ですが、オプション等を指定しない場合、ビルドした開発環境内にあるライブラリを全て取り込んでしまうので、必要のないライブラリを大量に取り込んでしまう場合があります。
関係ないライブラリを大量に取り込むと遅くなってしまうので、作成時のオプション指定を慎重に行いましょう。
2.Pythonをexe化するライブラリを比較
Pythonでexe化するライブラリはいくつか存在します。
まずは各ライブラリの特徴を比較してみましょう。
ライブラリ名 | exe化の手順 | ファイル容量 | 特徴 |
PyInstaller | コマンド1つで実行できる | 大きくなりがち | 比較的新しいPythonにも対応 |
Nuitka | コマンド1つで実行できる | 小さくなりがち | 英語を想定して作成されている |
PyOxidizer | プロジェクトを作成し、直下に作成したpyファイルを変換 | かなり大きくなりがち | Rust言語をインストールする必要がある |
cx_Freeze | 事前にsetup.pyを作成し同じファイル内にいれたpyファイルをコマンドで変換 | 小さくなりがち | exe化できると安定する |
py2exe | 事前にセットアップスクリプトを作成した上で変換を実行する | 小さくなりがち | 作成したexeファイルが比較的早い Windowsでのみ使用できる |
簡単に比較表を確認したので、各ライブラリを詳しく解説していきます。
①PyInstaller
Pythonのexe化ライブラリといったらこれと言われるほどメジャーなライブラリです。簡単にexe化できるだけでなく、比較的新しいPythonのバージョンでもexe化できるのが大きな特徴になります。
また、実行エラー時のコンソール画面を非表示にするなど配布する際に役に立つ機能が最初から含まれます。
②Nuitka
NuitkaはPythonコードを一度C++のコードにコンパイルし、C++のコードとして再コンパイルすることで実行可能ファイルを作成します。
C++でコンパイルするため、Pythonより実行速度があがる場合も多いです。
一度C++にコンパイルするため、exeファイルの作成にかなり時間がかかる場合があります。
③PyOxidizer
上記の表で記載したようにPyOxidizerはRustで作成されています。
そのため、Rust環境の構築が必要です。
また、PyOxidizerはすごい数の依存パッケージ数があり、作成したexeファイルの容量が大きくなりがちです。
Macで利用した場合、pathを通してくれないなど初心者には難易度の高いライブラリとなります。
④cx_Freeze
cx_Freezeの特徴は出力されるファイルが1つではない点です。
.dllファイルが作成され、これらがないと正常に動作しません。
また、exe化するPythonファイルのバージョンに応じてcx_Freezeのインストールするバージョンを気にする必要があります。
exe化に関しては難しくないので、適切なバージョンのインストールさえ出来てしまえば問題なくexe化できるでしょう。
⑤py2exe
py2exe最大の特徴はWindowsのみにしか対応していない点です。PythonでWindowsのみ対応というのはかなり珍しいライブラリになります。
また、setup.pyというファイルを作成しPythonファイルをexe化させます。
setup.pyで細かいオプションやどのPythonファイルをexe化させるかなどを指定可能です。
こちらのライブラリもインストールが上手くいくと比較的上手くexe化しやすいです。
3.PyInstallerを使う際の注意点
ここからは実際にPyInstallerを使う際の注意点を紹介していきます。
①仮想環境を使う
前述の通り、exe化する際にビルド環境にある全てのライブラリを含んでしまいます。そのため、無駄なライブラリを含まないように仮想環境を作成し、必要なライブラリのみインストールされた環境でexe化を行いましょう。
②onefileオプションを使うか使わないか
exeファイルを作成する際のオプションに「–onefile」があります。こちらを指定することでexeファイルのみが作成されます。
onefileを指定することでexeファイル1つにまとめることができますが、容量が大きくなり実行が重くなる場合があるので注意が必要です。
onefileを指定しない場合は、ファイルが複数作成されますが、実行が軽くなります。
配布する場合は指定する、個人利用の場合は指定しないなど使い分けましょう。
その他オプションについては後述します。
4.PyInstallerを使ってexe化する
ここからは実際にPyInstallerを使ってPythonファイルをexe化していきます。
①仮想環境を構築
Pythonの仮想環境は「pipenv」で作成します。pipenvを利用することで作業用フォルダごとに環境を作成できます。
環境作成用のフォルダを作成し、pipenvを使えるようにしましょう。
(この記事ではexeというフォルダを作成しました。)
pipenvを使用したことがない方はシェル上で下記コマンドを実行してください。
pip install pipenv
作成したフォルダに移動し、以下の手順で必要なライブラリをインストールします。
cd exe(フォルダ名)
pipenv --python 3.9
pipenv shell
pipenv install 必要ライブラリ
ライブラリのインストールが完了したら仮想環境の構築は完了です。
②PyInstallerをインストール
PyInstallerもpipenv同様、Pythonのパッケージ管理ツール「pip」でインストールします。
シェル上で下記コマンドを実行してください。
pip install pyinstaller
PyInstallerのインストールが完了したらいよいよPythonファイルをexeファイルに変換します。
シェル上で下記コマンドを実行してください。
(今回はtest.pyをexeファイルに変換します。)
pyinstaller test.py --onefile
上記コマンドを実行すると「build」、「dist」というフォルダと.specというファイルが作成されます。
補足
以下は今回作成したソースコードです。
import tkinter
tkinter._test()
exe化を想定し簡単ではありますがGUIを作成しています。
③よく使うオプション
ここからはPyInstallerでよく使うオプションを紹介します。
どれも知っておくと便利なので確認しておきましょう。
--onedir(-Dでも可)
出力を1ディレクトリにまとめる--onefile(-Fでも可)
出力ファイルを1つにまとめる--noconsole(-wでも可)
コンソールを表示しない。--clean
ビルド前に前回のキャッシュ、出力ディレクトリを削除
オプションを複数指定したい場合は下記のように指定します。
pyinstaller test.py --onefile --onedir --noconsole --clean
③exeファイルを実行してみる
exeファイルは先ほど作成された「dist」内に格納されています。
作成されたexeファイルをダブルクリックで実行してみましょう。
無事、コマンドを使用せず実行することができました。