Pythonで実行ファイルを作成してみました。
作成するにはPyInstallerを使ってみましたが、MacではWindowsのEXEファイルを作成することが出来ないということが分かりました。
MacからEXEファイルを作りたい場合は、Golangを使ってみるのもアリです。
この記事では、PyInstallerを使ったMacとWindowsで検証した結果を解説しています。
PyInstallerとは
PyInstallerとは、さまざまなOSでスタンドアロンとして実行可能ファイルにパッケージ化します。
Windowsはもちろんんこと、MacやLinuxといったOSでも可能です。
ほかにもPyQtやDjangoなどのライブラリが完全サポートされています。
PyInstallerのインストール
PyInstallerをインストールするには、pipコマンドを利用して導入します。
下記がそのコマンドです。
$ pip install pyinstaller
問題がなければ、下記のような形でインストールが完了します。
Collecting pyinstaller
Using cached pyinstaller-4.5.1-py3-none-macosx_10_13_universal2.whl (1.6 MB)
Requirement already satisfied: setuptools in /Users/ユーザ名/venv/lib/python3.9/site-packages (from pyinstaller) (57.4.0)
Requirement already satisfied: pyinstaller-hooks-contrib>=2020.6 in /Users/ユーザ名/venv/lib/python3.9/site-packages (from pyinstaller) (2021.3)
Requirement already satisfied: macholib>=1.8 in /Users/ユーザ名/venv/lib/python3.9/site-packages (from pyinstaller) (1.15.2)
Requirement already satisfied: altgraph in /Users/ユーザ名/venv/lib/python3.9/site-packages (from pyinstaller) (0.17.2)
Installing collected packages: pyinstaller
Successfully installed pyinstaller-4.5.1
エラーも出ずに、Successfullyがでれば問題ないです。
実行ファイルの作成
「テスト」と表示するだけのPythonスクリプトを作成します。
ファイル名は、exe_sample.pyとしています。
print('テスト')
このファイルで実行ファイルを作成するには、下記のpyinstallerコマンドを利用して作成します。
$ pyinstaller exe_sample.py
問題なく作成が完了すると下記のディレクトリやファイルが作成されます。
作成データ
- __pycache__
- build
- dist
- Pythonファイルのspec
distの中に実行ファイルが作成されるので、実行してみます。
$ ./dist/exe_sample/exe_sample
テスト
問題なく実行できて、「テスト」が表示されました。
動くわけがないと思っていますが、出来たファイルをWindowsで実行してみます。
Windows用に作成しないと動かないのは当たり前です(笑)
specファイルとは
specファイルとは、PyInstallerがspecファイルの内容を実行してアプリをビルドします。
そのため、specファイルには処理方法などの指示を書いたりするため、実行可能なPythonコードになります。
specファイルは、PyInstallerを実行すると自動で作成されますが、カスタマイズすると便利な場合があります。
メリット
- dllやsoファイルを含めることができる
- アプリにデータファイルをバンドルしたい場合
- ランタイムオプションを追加したい場合
- 共通モジュールをマージしたバンドルを作成する場合
spec ファイルを構成する4つのクラス
specファイルは、4つのクラスのインスタンスを作成します。
インスタンス
- Analysis
- PYZ
- EXE
- COLLECT
Analysisでは何をやっているかというと、スクリプト名を入力して、すべてのインポートとその他の依存関係を分析します。
そのため、Pythonのスクリプトファイル名やそのパス、インポートを検索するためのパスなどが、このAnalysisに含まれています。
PYZとはなんなのかというと、Cythonで書かれたファイルのことです。
EXEではAnalysisで分析されたスクリプトやPYZのアーカイブをもとに、構築されます。
このインスタンスを元に実行ファイルの作成を行います。
COLLECTでは何をやっているかというと、フォルダの作成などのアウトプット処理を行なっています。
EXEファイルへの変換
MacからEXEファイルを作成できるのかというとできません。
EXEファイルってWindowsの実行ファイルなので、MacからPyInstallerを使ってEXEファイルを作成することはできない。
なので、EXEファイルを作るにはWindowsでpyinstallerを実行してあげる必要があります。
ちなみにGolangだとMacやLinuxからでもWindowsで実行できるEXEファイルを作成することが可能です
Windowsのコンソール画面で下記のコマンドを実行します。
$ pyinstaller exe_sample.py
問題なく作成できると、下記のフォルダが作成されます。
作成したEXEファイルを実行
実行ファイルは、distの中にあります。
ここでは、dist/exe_sample/exe_sample.exeになります。
ダブルクリックしても一瞬だけコマンドプロンプトの画面が表示されるだけです。
理由としては、printしか表示していないからです。
なので、コマンドプロンプトから実行すると「テスト」が表示されます。
一つの実行ファイルにしたい
distディレクトリ(フォルダ)の中に実行するためのライブラリなど様々なファイルが作成されます。
しかし、自社のメンバーや他社の人に配る際にごちゃごちゃしていて、気持ち悪い。
しかも、実行ファイルだけ他の場所に移動するとライブラリやら無いなどで動かなくなる。
そういった場合は、オプションを指定することで一つの実行ファイルにまとめてくれます。
$ pyinstaller Pythonファイル --onefile
--onefileをつけることで、一つのファイルにまとめることができます。
おまけ
実行ファイルとpythonコマンドでカンタンに実行時間を計測してみました。
下記は、pythonコマンドで実行した結果です。
$ time python exe_sample.py
テスト
real 0m0.029s
user 0m0.019s
sys 0m0.007s
下記は、実行ファイル化したファイルを計測した結果です。
$ time ./dist/exe_sample
テスト
real 0m1.377s
user 0m0.116s
sys 0m0.076s
スピードに関しては正確では無いのですが、pythonで実行した方が速いです。
まとめ
PyInstallerを使うことで、WindowsはEXEファイルの作成ができMacやLinuxではPythonコマンドを使うことなく実行できるファイルが作成できます。
ファイル作成をするのに複雑な設定ファイルとかを書かないといけないのかと思ったのですが、「pyinstaller」のコマンドだけでカンタンに作成することもできます。
最後にスピードをカンタンに計測してみましたが、コンパイルしたのに逆に遅くなるって微妙な感じがします。
使い道はあると思いますが、私の場合はあまり無いなって感じました。
今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?