広告

posted by fanblog

2016年11月08日

python3でpy2exe

通勤電車の中でpythonの本を読んでいる。

>ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

IMG_1513.JPG




現在1/3程度読んだ(多層パーセプトロンまで)。
今は損失関数や誤差逆伝播法に入るところだ。
とてもわかりやすい。
素人の自分には。今までいくつか人工知能の本を読んだが、
一番わかりやすい。
素人が基本を学ぶのにとてもいい本だと思う。


そういえばpython、、、あれから使っていないなあ。。
なぜだろう?

、、、そう、
だいぶ前にpython3系でcx_fleezeを使ってexeファイルを作れるようになった。
>pythonでexeファイルを作ろう
http://fanblogs.jp/mountain4101/archive/48/0

>pywinautoとcx_freezeとpywin32の共存
http://fanblogs.jp/mountain4101/archive/49/0

ただ、、、
cx_fleezeってexeファイルとセットで幾つかファイルが隣にできるの。
exe含めて5個くらい。
それらがセットじゃないと動かない。
まあ、、、確かに何か新しいソフトをインストールすると
Cドライブのprogram filesフォルダにソフト名のフォルダができて
中身はexeファイル以外のものも一杯入っている。

そういう物だと割り切ればそうなんだけど、、、
僕がやりたいのは業務圧縮。
1ファイルがいいのだ。

最近安倍内閣で長時間労働の改善がニュースでよく聞く。
電通の事件もあったりするから。
仕事時間を短縮するようなツールが欲しいということ。
人間だと30分とか1時間とか、もっともっとかかることが
プログラミングを使うと1秒で終わってしまうようにしたい。
「人間より速い」ことがプログラミング、PCにとって
大事なこと。
難しいプログラミングをいくらしても、
人間より遅かったら意味がない。

くどくど書いたが日が暮れる、途方にもくれるような
やりたくないことを、1秒で終わらせる魔法のスイッチを作りたいと
思っている。

そして前の記事を書いてから今日までの間に数回、
そんな途方に暮れる、やりたくない作業に直面した。
僕は、こんなんやってられないよ!と(心の中で)発狂すると同時に、
プログラミングを実務に投入した。門をあけたのだ。

だが、、使った言語はVBA。
だってExcelだったから。
他の市販ソフトに入力しているある大量の情報を
他の人が作ったExcelに「手打ち」することを頼まれた。

「わかりました」と言って打ち込み始めたが、、、

入力する箇所はちょっとずつ離れていて、
数であったり寸法であったり符号であったり、と
まあ詳細は伏せるが、複数の種類のデータを部材数分入力するというもの。
部材数はざっと40くらい。
1部材の入力データの種類は5種類くらいで1部材あたり10か所以上は
入力するセルがある。
そして、もし市販ソフトの入力に変更が生じたら、
またその何百か所の手打ちをもう一度やるのか、、、と。

やってられん!!
そして僕はVBAを駆使し、
スイッチ一つですべてのセルに値を打ち込むプログラムを書いた。
案の定、実際2〜3回ほど変更があり、
作ってよかったと思う。

ここでpythonを使わなかったのは悲しいところである。
実務ではExcelをよく使う。
他の人もそのファイルを操作することもあるから
プログラミングを使うのは避けていた。
他の人が触れなくなるから。
ただ、今回は、他の人が作ったエクセルの中身は
一切いじらず、「手打ちでも使える」状態にし、
隣にスイッチを一つ付けただけである。
「手打ち」するところを「PCが打つ」だけの
プログラムを書いた。
これなら文句は言わせない。
指示した人が自分で入力したくなった時は
「どうぞ手打ちしてくれ」という姿勢だ。
(日が暮れると思うけど、と心の中。)

話はそれたが、結局本当に時間がないと
一番得意なVBAに走ってしまう。
別にVBA使えるだけでも十分職場の他の人に比べたら
速度は上がるのだが。
(他の人はVBAも使わないから。)

pythonも1ファイルのexeファイルにできれば
人に配布しやすい。
スイッチと同じ扱いになる。
押すだけ(ダブルクリックするだけ)でいいから。
わかりやすい。
1つのexeファイルにできれば
きっともっとpythonを実務で使うようになるのでは
ないだろうか、と思う。
そして他の人にも配布しやすい。
自分以外の人の業務時間短縮にもつながるのでは。
難しいプログラムの中身は自分が把握するとして、
気軽に使える便利なスイッチ的なexeを作って配布したい。

そこで、、、前置きが長かったが。
まずpyinstallerを使ってみた。(この記事のタイトルはpy2exeだが。。)

pythonをexeファイルにできる3つのツール
「pyinstaller」、「cx_fleeze」、「py2exe」の3つがあり、
この3つのキーワードでgoogleを検索していくつかサイトを見ていたらこのサイトがあった。
>My Future Sight for Past
http://myfuturesightforpast.blogspot.jp/2014/07/windowspython.html

上記サイトの中段の「3 exe化」の段落に
「これを使うことで驚くほど簡単に単独で動作するexeファイルを作れる。
 py2exeやcx_Freezeを試すのがバカらしくなってしまった。」
と書いてあった。
このセリフに妙に魅力を感じた。
で試してみた。

コマンドプロンプトにpip install pyinstallerでインストール

下の画像はwinpythonのspiderの画面である。
初期に作ったテキストファイルを吐き出すプログラム(test.py)。

pyinstaller01.JPG

これをpyinstallerで1ファイルのexeにする。
cx_fleezeと違ってsetupファイルは不要。
コマンドプロンプトでcdコマンドでtest.pyのあるフォルダに移動し、
「pyinstaller test.py --onefile --noconsole」と打ち込めばよい。
とても簡単。

で、僕はコマンドプロンプトを立ち上げるのもめんどくさいので、
下記のようにテキストファイルを作成し、ファイル名「setup.bat」で保存する。

pyinstaller02.JPG

あとはsetup.batをダブルクリックすればよい。
そうすると「__pycache__」、「build」、「dist」の3つのフォルダが隣にできて、
「dist」フォルダの中を除くと、ほんとに1ファイルでexeファイルができてるのだ。
衝撃。

pyinstaller03.JPG

アイコンもpythonな感じのアイコン。
ダブルクリックすると、ほんとにテキストファイルを吐き出してくれる。

pyinstaller04.JPG

ただ、こんなしょぼいプログラムで4.9MBある。
重いね。まあ、、でも相当楽よ。重さの分を差し引いても、楽すぎてすばらしい。
(cx_fleezeの存在がかすんでくるね。)


そして次はpy2exe。
今年の2月の時点で探したときは
python3系では使えないと聞いていたが、
今調べると、どうやらpython3.4以下なら使えるようだ。
(3.5は非対応のようだ)
僕はpython3.4を使っているので問題ない。

コマンドプロンプトにpip install py2exeでインストール。

py2exeでgoogleを検索していると
下記のサイトのタイトルに目が行く。

>[Python] pyInstallerの遅さにがっかりしてpy2exeにしたら爆速で驚いた件
http://april.fool.jp/blogs/2014/10/python-pyinstaller%E3%81%AE%E9%81%85%E3%81%95%E3%81%AB%E3%81%8C%E3%81%A3%E3%81%8B%E3%82%8A%E3%81%97%E3%81%A6py2exe%E3%81%AB%E3%81%97%E3%81%9F%E3%82%89%E7%88%86%E9%80%9F%E3%81%A7%E9%A9%9A%E3%81%84/

参考にさせていただいたが、
一番はタイトルである。
タイトルを見てクリックしたくなった。
まあ、たぶんpy2exeの方がだいぶ速いのだろう。

他に参考にしたサイトは、、
>baruthのメモblog
http://blog.livedoor.jp/baruth_/archives/19416524.html

>python-ism
http://www.python-izm.com/contents/external/exe_conversion.shtml

テキストファイルを吐き出すtest.py
は変わらないが、setupファイルを作成する必要がある。
下記の画像のsetup.pyファイルを用意した。

py2exe01.JPG

そしてコマンドプロンプトでtest.pyのあるフォルダにcdコマンドで移動し
「python setup.py py2exe」と打てばよい。
だがやっぱり僕はコマンドプロンプトを開くのがめんどくさいので
下記の画像のbatファイルを用意してダブルクリックする。

py2exe02.JPG

py2exe03.JPG

「dist」フォルダの中をのぞくと3つのファイルができている。
"bundle_files": 1 にしているが、
どうしても3つのファイルにまとめられてしまう。
(exeファイル以外に2つ吐き出される)
dllファイルとライブラリの圧縮ファイルだ。
どこかのサイトにpython3系だと3しかできない、と
書いてあったが、そういうことなのだろうか?

容量は全部で合計5.44MB。
あれ?なんだかpyinstallerの方が軽い。
でもexeファイルだけなら30kBなので圧倒的にpy2exeの方が軽い。
ダブルクリックしてみる。。。。
あんまり早く感じない。
pyinstallerと同じ約1秒後にtextファイルが吐き出される。

ちなみにcx_fleezeのsetupファイルは下記のような感じ。

cx_fleeze01.JPG

"excludes"部分で不要なライブラリを削っていくと1MB以上は軽くなった。
'readline'部分でwarningが出るが、
'readline'自体使っていないので、同様に"excludes"で
除外してしまうとwarningが出なくなる。

batファイルはこんな感じ。

cx_fleeze02.JPG

吐き出されるファイルはこんな感じ。

cx_fleeze03.JPG

容量は合計で5.87MB。
exe単体だと3.9MB。
まあ、使うライブラリが増えてきたら
もっと容量は増えるのかなあ。

そうするとpyinstallerがファイルの合計だと一番軽い。。。
一番楽だし。。。
まあ、もっと重いモジュールをたくさん使うようになったら
exeのみが圧倒的に軽いpy2exeが効いてくるのかもしれない。

まあ、どうするにしろ、
3つのツールをすべて使えるようになった。

ちなみにNSISというソフト
(自作のアプリケーションのsetupファイルを作るときに使うソフト)を使うと
py2exeもcx_fleezeも1ファイルにできるらしい。
1つ手間が増えてしまうが。
なので次はNSISを勉強してみたいと思う。


posted by iyoder at 22:54 | Comment(0) | TrackBack(0) | プログラム
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
http://fanblogs.jp/tb/5603373
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
最新記事
<< 2018年12月 >>
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
カテゴリーアーカイブ
ファン
プロフィール
最新コメント
×

この広告は30日以上新しい記事の更新がないブログに表示されております。