Python

【Python】Pyinstallerでpyファイルを配布用に.exe化する

この記事は約6分で読めます。

 

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

 

参照:

 https://qiita.com/pocket_kyoto/items/80a1ac0e46819d90737f#%E3%81%9D%E3%81%AE%EF%BC%93unicodedecodeerror-utf-8-codec-cant-decode-byte-0x83-in-position-130-invalid-start-byte

 

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

  1. […] 関連記事:【Python】Pyinstallerでpyファイルを配布用に.exe化する […]

  2. […] 関連記事:【Python】Pyinstallerでpyファイルを配布用に.exe化する […]

タイトルとURLをコピーしました