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

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

 

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で



「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」

「エンジニアとして若いうちから高収入を得たい」



という強い気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする

   侍エンジニア塾       
侍エンジニアの無料体験レッスンを予約する -->