Pythonで作成したプログラムをexe化すると、ダブルクリックだけでプログラムを実行でき、Python環境が無くても簡単に使用できます。cx_Freezeを使ってexe化を行ったのですが、初めてでつまづくことが多かったので、備忘録として手順を記載します。
cx_FreezeかPyInstallerか
結論としてはGPLライセンスであるPyInstallerは避けて、PSFライセンスであるcx_Freezeでのexe化を行いました。以下に判断理由を記載します。
一般にオープンソースソフトウェア(OSS)では利用条件としてソースコードの開示が義務付けられる場合があります。ソースコードの開示が必要かどうか知るには、用いているプログラムのライセンスを調べてみてください。
PythonもOSSの1つなので、アプリなどを配布する際にはライセンスに気をつける必要があります。
ライセンスにはいくつも種類があり、以下はその一例です。
- Python自体: PSFライセンス(https://www.python.org/psf/)
- numpy: BSDライセンス(https://github.com/numpy/numpy/blob/main/LICENSE.txt)
- matplotlib: PSFライセンス(https://matplotlib.org/stable/users/project/license.html)
- pandas: BSDライセンス(https://github.com/pandas-dev/pandas/blob/main/LICENSE)
- PyInstaller: GPLライセンス(https://pyinstaller.org/en/stable/license.html)
- cx_Freeze: PSFライセンス(https://cx-freeze.readthedocs.io/en/latest/)
専門家ではないのでネットで調べた限りですが、PSFライセンスの場合は特に記載事項不要、BSDライセンスの場合はライセンス使用の明示が必要、GPLライセンスの場合はライセンス使用明示&ソースコード公開が必須、という感じに理解しています。(ライセンス記載方法については自己責任でお願いします。本ブログで問題になった場合には記事にしようと思います。)
ソースコードを積極的に公開したくない方は、「pip list」コマンドをコマンドプロンプトなどで入力して自分の環境にあるライブラリのライセンス一覧を取得し、ライセンスごとにソースコード公開義務の有無などを調べてみてください。
GPL、LGPLなどのライセンスについてはできる限り使用しないのがライセンス違反を避けるために重要だと思います。
cx_Freezeでのexe化の方法:コマンドプロンプトを使用
流れとしては、Python,cx_Freezeをインストールし、cx_Freezeの実行ファイルsetup.pyを作成してコマンドプロンプトでsetup.pyを実行すればexe化完了です。
Pythonとcx_Freezeのインストール
cx_Freezeのサイトをご覧いただくと、Pythonのversionとcx_Freezeのバージョンを合わせる必要があることが分かります。(ex. cx_Freezeのバージョンが6.4-6.8の場合はPythonのバージョンは3.6-3.9である必要あり)
私が今回用いたWindows PCではPythonのバージョンが3.10.4でcx_Freezeのバージョンが6.10でした。
cx_Freezeのインストール自体は「pip install cx-Freeze」とコマンドプロンプトで実行すれば完了です。(基本的にはPythonもcx_Freezeも最新バージョンにすれば良いと思います。)
ちなみにコマンドプロンプトでcx_Freezeをインストールしようとしてpipでインストールが上手く行かない場合、使用しているwindows環境にコンパイラ(人が書いたプログラムをコンピュータが解読できる形式に変換するソフトウェア)が入っていない可能性があります。私も最初にMicrosoft C++ Build Toolsのダウンロードを行いました。(https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16)
setup.pyの作成
私がグラフ表示アプリ(csv_2Dplot.exe)をpythonで作成したときのexe化の方法をご紹介します。
以下のようなPythonファイル(ここではsetup.pyという名前)を作って、「python setup.py build」とコマンドプロンプトで実行すればexeファイルが作成されました。
(cx_Freezeのサイトに記載されているものを参考にしました。)
import sys
from cx_Freeze import setup, Executable
base = None
includes=["config"]
#csv_2Dplot.py.pyをexe化
exe = Executable(script = "csv_2Dplot.py", base= base)
setup(name = 'csv_2Dplot',#作成するexeファイルの名前
version = '0.1',
description = 'converter',
options={"build exe":{"includes":includes}},
executables = [exe])
失敗談
anaconda promptだと失敗
私は最初コマンドプロンプトではなく、anaconda promptの環境で上記と全く同じ流れでexe化を目指したのですが、「mkl_intel_thread.dllを読み込めません」といったエラーが出て解決できませんでした。
色々調べている中で「conda 環境下で mkl のロードに失敗するときの対処法あれこれ」という記事ではmkl=2018.0.2というバージョンにダウングレードすることで上手く行ったと書かれていたので試しました。
驚いたのは「conda install mkl=2018.0.2」の処理が終わるまで丸1週間かかったことです。ずっとconflictという文字が表示され続けて、進んでいるのかどうかすらよくわからない状況でした。1週間経って処理が終了していたのですが、ログの最後の部分もconflictの文字があって解決した感じはありませんでした。mklのバージョンも上記のものにダウングレードできておらず、anaconda環境下でのexe化を諦めました。(正しい方法があるのでしょうが、私はconda環境でpipも使ったのでデバッグが面倒臭そうでした。)
結果としてコマンドプロンプトで試してみたらexe化できました。
pythonファイルの冒頭が数字だとコンパイルできない
数字をファイル名の冒頭にしていたらコンパイルが上手くいかず、名前をローマ字始まりにしたらコンパイルできました。
作成したexeファイルを動作させようとするとすぐ画面が閉じてしまって何が問題かわからない
cx_Freezeで作成したexeがそのPCで動作しない、あるいは別のPCで動作しない、ということは多々あります。(Pyinstallerで作成すると動いたりします。コマンドプロンプトで「pip install pyinstaller」→「pyinstaller (ファイル名)」)
エラーメッセージを見るためにはbatファイルを作成しました。メモ帳でテキストファイルを作成して、ファイル名を「*.txt」から「.bat」に変更すればbatファイルになります。
batファイルには以下のように記述します。
[exe化したファイル名] %1
PAUSE
batファイルを動かしたいプログラムと同じディレクトリにおき、ダブルクリックすることでエラーメッセージを見ることができます。
[参考]「cx_Freezeでexe化。「matplotlibのモジュールが見つかりません」のエラー対処」
コメント