広告

posted by fanblog

2016年11月16日

pywinautoの1ファイルexe化


前回記事で「pyinstaller」,「cx_freeze」,「py2exe」
の3つを1ファイルexe化が可能となった。

>NSISでpy2exeとcx_freezeを1ファイルexe化
http://fanblogs.jp/mountain4101/archive/59/0

さっそく
仕事効率化へのささやかな1歩として
pywinautoの簡単なプログラムを
「pyinstaller」,「cx_freeze」,「py2exe」の3つで
exe化してみよう。

まずはpy2exe。

今回pywinautoで書いたのは
以前の記事で書いたCADを立ち上げて
名前を付けてファイルを保存する、というプログラムに
更にソフトをとじるとこまで自動でするように追加したもの。

最初はうまくexeファイルができなかった。
なのでsetupファイルは下記のように変えた。

pywinauto_exe06.JPG

distファルダに56個もファイルができたが、
どうやらexeファイルもできている。
そのままNSISで1ファイルのexeにした。

ん、、、

115MB。。。

えーーーーー。
なんてこった。
.pyのソースは2kBなのに。
pythonというのはほんとパッケージに
頼っているんだと思った。
これでは他の人に容易に配れる感じではない。

ダブルクリックすると
「名前をつけてファイルを保存する」ダイアログが
表示されない。。
あれ?前は動いたのに。

そこでstartで起動した後に
3秒のsleepを挟んだ。
そしたらきちんとすべて自動で動いた。
(下記の画像)

pywinauto_exe05.JPG

どうやらCADを起動(start)し終わる前に
ソフトに接続(connect)の命令が素通りしていたようだ。
まあ、そこらへんはもっとプログラムに詳しくなってからでいいや。
無事CADのファイルがフォルダにできていた。

ただし、CADのソフトが閉じるときに
変なウインドウが表示された。

pywinauto_exe02.JPG

logについて言っているが
logファイルがない。

そこで1ファイルにする前の状態で
exeを実行してみた。
するとlogファイルが出力された。

pywinauto_exe03.JPG

どうやら32bitの自動化をしているのに
あなたは64bitのpythonを使っている、ということらしい。
いやいや、exeを実行するたびにこんなのが表示されて
手動で閉じるまで表示され続けるという。
pywinautoとpy2exeの相性はよくないのか?

py2exeの実験はここまでだな。

ちなみに
NSISで1ファイル化するときに
;!define compressor
の「;」を外して圧縮すると
1ファイルのexeの容量は30MBまで減る。
ただ、ダブルクリックしてからCADが起動するまで
解凍分、若干タイムラグがある。

(11/17追記)
「py2exe」のsetupファイルを下記のように
色々excludeしたら
5MBにまで減った。

pywinauto_exe10.JPG

PyQtが重かったのかなあ。
メニュークリックの自動化なら
5MBしか必要としないということだ。
速度も速い。
cx_freezeと変わらない。

まあ、相変わらず
py2exeは
warningのウインドウが表示されるから
そいつを自動で閉じるようにしないと
他の人にはexe渡せないけど。
一歩前進。





次はcx_freeze。

1ファイル化しない状態だと
buildフォルダに45個のファイルが出力される。
1ファイル化すると108MBになる。

pywinauto_exe07.JPG

ただダブルクリックすると
コマンドプロンプトがCADの後ろで
こっそり立ち上がって64bit pythonで32bit自動化について
文字がこっそり表示されているが、
CADソフトの起動→名前を付けて保存→ソフトを閉じる
までの一連の流れは最も早くスムーズだ。
コマンドプロンプトも後ろで自動で閉じられていた。
pyinstallerやpy2exeに比べて
exe化しないときの動きに最も近いかもしれない。

NSISで圧縮すればきっと30MBになるのだろうが、
このスムーズさが少しでも損なわれるのはデメリットだと思う。

(11/17追記)

cx_freezeも容量削減について
色々調べてみた。
すると下記のサイトに
includeやexcludeのオプションが書いてあることが分かった。

>音楽プログラミングの超入門(仮)
>Python スクリプトのスタンドアロン化
http://yukara-13.hatenablog.com/entry/2014/10/11/195316

py2exeでexcludeしたのと
同じパッケージをexcludeした。
setupファイルの最後の2行(options)も追記するのを忘れずに。

pywinauto_exe11.JPG

ついでに仕方なくNSISで圧縮もした。

最終的には7MBまで減った。

cx_freezeであればワーニングの表示される
コマンドプロンプトもそこまで目立たず自動で消えるので
これなら実務でも使えそうである。
(いやあ、今回は諦めずに素人なりによくがんばったなあと自分で思う。)



最後にpyinstaller。

pywinauto_exe09.JPG

exeファイルは簡単にできる。
容量は35MB。

ただし、最初はダブルクリックしたときに
途中でエラーで落ちた。

その後、
py2exeと同様、3秒のsleepをかませたら
落ちずに最後まで動いた。
cx_freezeに比べると遅い気がした。

3秒sleepのさじ加減はアナログ感たっぷりだと思ったが、
CADソフトが起動しきるまで
connectを発信し続けるようにfor文なりif文を
使えばそこらへんは自動で100%処理できるのだろう。
なので今は気にしない。


(11/17追記)

pyinstallerも容量削減について
色々調べてみた。
すると下記のサイトに
excludeのオプションが書いてあることが分かった。
(すべて英語、、)

>Using PyInstaller
https://pythonhosted.org/PyInstaller/usage.html

py2exeやcx_freezeでexcludeしたのと
同じパッケージをexcludeした。

今回はsetup.pyファイルではなく、batファイルである。

pywinauto_exe12.JPG

最終的には9MBまで減った。
(NSISの圧縮を介さない分、py2exeとcx_freezeよりは重めかな)
こちらも実務で使えそうだ。




目下、最大の課題は
ファイル容量だと思う。
(11/17追記)
→一応解決。
 5〜9MBまで減った。


VBAだとウインドウハンドルの取得やsendmessageは
結構使えるようになったが、
メニューのクリックは
「階層」をたどるプログラミングがうまくできない。
menuiteminfo構造体とか、、うまく動くときと動かないときがある。
その点pythonのpywinautoはメニュークリックをここまで
簡単に、短いソースで扱えるのは便利だ。
exe化さえしなければかなり優秀といえる。

VBAに戻りたくなるが、、、今はpythonで粘りたいところである。
仕事効率化にはまだ遠いなあ。
(11/17追記)
→結構着々と進んでいる気がしてきた。
(py2exeのワーニングさえ出なければ文句ないのに。)


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

お名前:

メールアドレス:


ホームページアドレス:

コメント:

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

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

この記事へのトラックバック
最新記事
<< 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日以上新しい記事の更新がないブログに表示されております。