Pythonでexe化に苦戦~Matplotlibの日本語対応~

Pythonでexe化
  • URLをコピーしました!
※当ブログではアフィリエイト広告を表示しています
まゆみ

Pythonで作ったブログ検索順位取得ツール、もう少しきちんと作りこんで、人に渡したい(売りたい)なぁ~

ということを考え始めました。
Python初心者のまゆみです。

Pythonのパの字も知らなかった超初心者の段階でブログのGoogle検索順位を取得してグラフも作るツールを作ってみました

上記の記事の時点で満足していたのですが、もう少し作りこんで人に渡せるようにしたいなと考え始めまています。
あわよくば製品として売り出したい。

そうするには、まずは製品として渡せるようにしないといけません。

Pythonの環境がないPCでも動かないと意味がありません。

という訳で、今回はPythonコードで作ったツールを実行形式(exe)にしてみました。

今回使用したのはpyinstallerというモジュールです。
グラフ作成に使用しているMatplotlibとpyinstallerは相性が良くないようで、私も凡例の日本語化につまづいちゃいました。
しかし、少しだけ修正コードを挿入したら、上手くいくようになりましたよ。

目次

実行形式(exe)にしてみる

Pythonで実行形式ファイル(exeファイル)を作成する方法です。

pyinstallerのインストール

Pythonで書いたコードをwindowsアプリケーションとしてexe形式にする場合、一般的なのは「pyinstaller」というモジュールを使うのが良いそうです。

ということで、いつものようにpipでpyinstallerをインストールします。

<コマンド>
pip pyinstaller

ひとまずexeを作ってみた

ひとまず、pyinstallerを使ってみます。

「searchGUI.py」のファイルの中に全てのコードが入っており、それをexe化してみます。

<コマンド>
pyinstaller searchGUI.py

コマンドプロンプトでソースファイルがあるフォルダに移動後、上記のコマンドを打つと、1~2分の時間がかかりましたがファイルが作成されました。

「dist」というフォルダが作成され、その中にツール名(searchGUI)のフォルダができて、そのフォルダの中にたくさんのファイルが出来上がっています。

その中に、作りたかったexeファイルがあります。
今回の場合は「searchGUI.exe」です。

pyinstallerを実行した結果。ファイルがたくさんできた。
pyinstallerを実行した結果。ファイルがたくさんできた。

しかし、こんなにたくさんファイルができてしまったけど、このファイル全部必要なの??

python環境がないPCでツールを実行したい場合は、このファイルを全部渡さないといけないのでしょうか?

一般的に使われているexeファイルは1つだけで動くよな・・・

1つのファイルのみにする

何もオプションを指定しないと、たくさんのファイルができてしまったpyinstaller。

調べてみると、オプションを指定したら作られるファイルが1つだけになるようです。
ファイルは1つだけの方が配布しやすいですから、1つにまとめてしまいましょう。

<コマンド>
pyinstaller searchGUI.py –onefile –clean –noconsole

オプションの内容は以下です。

・–onefile:1つのファイルにまとめる

・–clean:exeファイルを消してから再作成

・–noconsole:コマンドプロンプトを表示しない

※↑の「–」はハイフン「-」2つです(見づらくてすみません)

以上のオプションを付けてpyinstallerを実行してみると、「dist」フォルダの中にexeファイルが1つだけ作成されました。

pyinstaller で1つのファイルにまとめるオプションを追加した結果。
pyinstaller で1つのファイルにまとめるオプションを追加した結果。

プロットの日本語が文字化けする対策

ツールをexe形式ファイルにすることができたので、実行してみました。

すると

pyinstaller,matplotlib:exe化したツールでグラフ作成した際にでる警告文
グラフ作成時に出る警告文

グラフを表示させようとすると、このような警告文が表示されてしまいます。
(コマンドプロンプトを表示するよう設定してexe化した場合に見える)

グラフ自体はエラー無く表示されるのですが、以下のように

pyinstaller,matplotlib:exe化したツールでグラフを表示した結果。凡例の日本語が文字化けしている
exe化したツールでグラフを表示した結果。凡例の日本語が文字化けしている。

凡例の日本語が文字化けしちゃっています。
本当は「BabyKumon 効果」となるはずです。

日本語の文字化けについてググってみて、以下の2つの参考ページを見つけて、コードを修正してみました。

参考:・PYINSTALLER + 日本語の時の注意点
   ・Matplotlibで簡単に日本語を表示する方法(Windows)

まずは、pyinstallerでexe化するとエンコードが変わってしまうのを防ぐために、メイン関数に以下のコードを追加。
UTF-8になるように設定しています。

	if hasattr(sys, 'setdefaultencoding'):
		import locale
		lang, enc = locale.getdefaultlocale()
		sys.setdefaultencoding('utf-8')

次に、グラフに表示する凡例のフォントを直接指定するように、グラフ作成部分のコードを修正しました。
6行目の「prop={“family”:”MS Gothic”}」を追加しています。

	#凡例
	plt.legend(bbox_to_anchor=(0,1.02,1,1.02), #グラフの上に
				loc='lower center',        #凡例の下中央を合わせる
				borderaxespad=0,               #隙間はなし
				ncol=3,                        #3列で表示
				prop={"family":"MS Gothic"},    #日本語対応
				mode='expand')                 #拡大させる

修正して再度exe化したツールを実行してみた結果はこちら。

pyinstaller,matplotlib:修正したexeでグラフを表示した結果。凡例の日本語が表示された。
修正したexeでグラフを表示した結果。凡例の日本語が表示された。

きちんと日本語の凡例が表示できるようになりました。

ファイルサイズを小さくする

exeファイルを作ってみてびっくりしたのですが、出来あがったファイルサイズがめちゃくちゃ大きいのです!

なんと31MB!!

なんでこんな大きいの?
どうしたら小さくなる?

と調べてみたら、以下の参考ページに行きつきました。

参考:Pythonで組んだプログラムをPyInstallerでexe化したらめちゃくちゃサイズがでかくなった件【2019年6月、解決策追記】

参考ページにあった、exe化するときに必要ないモジュールを「–exclude」で含めないように設定してみました。
具体的には、numpyというモジュールを省いてみました。

<コマンド>
pyinstaller searchGUI.py –onefile –clean –noconsole –exclude numpy

その結果は

pyinstaller:ファイルサイズを小さくしてみた結果
ファイルサイズを小さくしてみた結果

numpyを省いた結果、31MBが21MBまで小さくなりました!
それでもまだまだ大きいですが、他に削るものもないし・・・
ひとまず、これで良しとします。


Pythonって大変。
exe化するだけでこんなに大変だとは。
やっぱりVBAとかC#でツールを作った方が楽ですね。

ブログ検索順位取得ツールをいつか売り出したいと思っていましたが、Python版はファイルサイズが大きすぎるから止めようかな・・・

VBAで同じことができないか試してみようと思います。

んじゃ、また~

プログラミングの独学方法は?おススメをまとめました

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

関連記事

応援よろしくお願いします☆

この記事を書いた人

理系夫婦の妻のほうです。
大学、大学院(修士)で物理を専攻。
2016年に長女を出産、2021年に長男を出産。
フルタイム勤務ワーママ→休職→専業主婦。

コメント

コメントする

目次