Contents
Pythonのプログラムをアプリ化する
自分が作ったPythonのプログラムを他人に使ってもらえるように、Pythonの入っていないほかのPCでも使えるようにするためには、Pythonのスクリプトをバイナリにコンパイルして.exeファイルに変換する作業が必要になります。
これはすでに有志がライブラリ化してくれたものが用意されており。有名なもので3つあります
- 「embeddable python」
- 「py2exe」
- 「Pyinstaller」
この中だと「Pyinstaller」というライブラリが一番簡単なので、今回はこれを使っていきます。
Pyinstallerのメリットとデメリット
「Pyinstaller」のメリットとしてあげられるのは、簡単で使い方を紹介しているサイトも多いので、コンパイル時にエラーが起こった場合でもハマりにくいという点が挙げられます。
逆にデメリットとしては、作成した.exeの起動が遅いという点が挙げられます。なので初めてPythonのプログラムを.exeに変換するといった時には「Pyinstaller」がおすすめです。
ツール化後の起動や処理の高速化を考えるとほかの2つの方がおすすめですが、そもそも本当に高速化を考えるならVisual StudioのC#とかで作れって話ですし、GUIツールをマジで作るならそもそもPythonなんかを使うなって話になるという感じなので、自分はPyinstallerをオススメしています
Pyinstallerのインストール
まずはpyinstallerをインストールします。
インストールはいつもと同じくpipコマンドで行えます。
# pyinstallerをインストールする $ pip install pyinstaller
PyinstallerでPythonプログラムを.exeに変換する
というわけでいよいよ本題に入っていきます。
今回は.exe化するのは↓の記事で作成したデスクトップアプリです。
ファイルを選択してボタンを叩くとファイル名をテキストボックスに吐き出してくれるアプリです。これを「Pyinstaller」で、.exeファイルに変換します。そのためのコマンドは以下のように記述します
# Pythonのプログラムを.exeに変換する $ pyinstaller --onefile --noconsole --hidden-import=tkinter [pyファイルのPATH]
コマンド引数の「–onefile」はpyファイルを使用しているライブラリもまとめて1つの.exeに変換するという意味です。
「–noconsole」は起動時にコマンドプロンプトを表示しないようにします。
「–hidden-import=tkinter」はおまじないで、matplotlibやtkinterを使ったプログラムがなぜかコンパイルできないというときはこの引数を加えるとうまくいくことがあります。
これを実行すると処理が開始され、完了すると実行したディレクトリ直下に「dist」というフォルダが作成され、その中にpyファイルをexe化したものが出力されています。
pyinstallerのよくあるコンパイル時のハマりケース
pyintstallerは上述した「embeddable python」や「py2exe」に比べるとバイナリ化が簡単ですが、それでも何か所かハマりポイントがあります。いかに僕が遭遇したコンパイル時のエラーとその解決法を記述しておきます。
・「maximum recursion depth exceeded
pyinstallerでスクリプトをコンパイルするときによく起こるエラーの筆頭が、「 maximum recursion depth exceeded」です。これはコンパイル時にpythonの再帰回数の上限を超えてしまうことが原因です。プログラムにpandas/numpyを組み込んでいるとよく起こります。
対処法としてはコンパイル時に生成された.py[ファイル名].specの中身を以下のように書き換えて.specファイルをコンパイルします。
[pyファイル名].spec
# -*- mode: python ; coding: utf-8 -*- ~~
↓
# -*- mode: python ; coding: utf-8 -*- import sys sys.setrecursionlimit(10000) ~~
再帰回数の上限をsysを弄って増やしています。
・UnicodeDecodeError: ‘utf-8’ codec can’t decode byte~
pyinstallerに限らずWindowsでpythonを触っているとよく起こるエラーの一つ。コンパイルしているスクリプトの文字コードがCP932(ShiftJIS)になっていないかまず確認して、そうだったときはUTF-8 に変換しましょう。
それでも治らない場合は「c:\users\user\anaconda3\lib\site-packages\PyInstaller\compat.py」を書き換えます。
concat.pyの400行目辺りにある以下の部分を次のように書き換えます(バージョンによって記載行が異なります)
out = out.decode(encoding) ↓ # out = out.decode(encoding) out = out.decode(encoding, errors='ignore')
module ‘pyqt5’ has no attribute ‘__version__’ pyinstaller
pyqtがバージョンアップで属性設定が変わっていることが原因。sklearnとかでよくある類のエラー。
解決法はpyqtのバージョンを5.15.3にすることです。
$ pip install pyqt5==5.15.3
参照:https://github.com/mottosso/Qt.py/issues/28
参照:
コメント
[…] 関連記事:【Python】Pyinstallerでpyファイルを配布用に.exe化する […]
[…] 関連記事:【Python】Pyinstallerでpyファイルを配布用に.exe化する […]