【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をインストールします。

インストールはいつもと同じくpipコマンドで行えます。

 

 

# pyinstallerをインストールする
$ pip install pyinstaller
or
$ pip install --upgrade 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を使ったプログラムがなぜかコンパイルできないというときはこの引数を加えるとうまくいくことがあります。

 

 

スポンサーリンク
スポンサーリンク

 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')

 

 

 

参照:

 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

 

 

 

 

 

コメント

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