2016年11月16日
pywinautoの1ファイルexe化
前回記事で「pyinstaller」,「cx_freeze」,「py2exe」
の3つを1ファイルexe化が可能となった。
>NSISでpy2exeとcx_freezeを1ファイルexe化
>https://fanblogs.jp/mountain4101/archive/59/0
さっそく
仕事効率化へのささやかな1歩として
pywinautoの簡単なプログラムを
「pyinstaller」,「cx_freeze」,「py2exe」の3つで
exe化してみよう。
まずはpy2exe。
今回pywinautoで書いたのは
以前の記事で書いたCADを立ち上げて
名前を付けてファイルを保存する、というプログラムに
更にソフトをとじるとこまで自動でするように追加したもの。
最初はうまくexeファイルができなかった。
なのでsetupファイルは下記のように変えた。
distファルダに56個もファイルができたが、
どうやらexeファイルもできている。
そのままNSISで1ファイルのexeにした。
ん、、、
115MB。。。
えーーーーー。
なんてこった。
.pyのソースは2kBなのに。
pythonというのはほんとパッケージに
頼っているんだと思った。
これでは他の人に容易に配れる感じではない。
ダブルクリックすると
「名前をつけてファイルを保存する」ダイアログが
表示されない。。
あれ?前は動いたのに。
そこでstartで起動した後に
3秒のsleepを挟んだ。
そしたらきちんとすべて自動で動いた。
(下記の画像)
どうやらCADを起動(start)し終わる前に
ソフトに接続(connect)の命令が素通りしていたようだ。
まあ、そこらへんはもっとプログラムに詳しくなってからでいいや。
無事CADのファイルがフォルダにできていた。
ただし、CADのソフトが閉じるときに
変なウインドウが表示された。
logについて言っているが
logファイルがない。
そこで1ファイルにする前の状態で
exeを実行してみた。
するとlogファイルが出力された。
どうやら32bitの自動化をしているのに
あなたは64bitのpythonを使っている、ということらしい。
いやいや、exeを実行するたびにこんなのが表示されて
手動で閉じるまで表示され続けるという。
pywinautoとpy2exeの相性はよくないのか?
py2exeの実験はここまでだな。
ちなみに
NSISで1ファイル化するときに
;!define compressor
の「;」を外して圧縮すると
1ファイルのexeの容量は30MBまで減る。
ただ、ダブルクリックしてからCADが起動するまで
解凍分、若干タイムラグがある。
(11/17追記)
「py2exe」のsetupファイルを下記のように
色々excludeしたら
5MBにまで減った。
PyQtが重かったのかなあ。
メニュークリックの自動化なら
5MBしか必要としないということだ。
速度も速い。
cx_freezeと変わらない。
まあ、相変わらず
py2exeは
warningのウインドウが表示されるから
そいつを自動で閉じるようにしないと
他の人にはexe渡せないけど。
一歩前進。
次はcx_freeze。
1ファイル化しない状態だと
buildフォルダに45個のファイルが出力される。
1ファイル化すると108MBになる。
ただダブルクリックすると
コマンドプロンプトが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)も追記するのを忘れずに。
ついでに仕方なくNSISで圧縮もした。
最終的には7MBまで減った。
cx_freezeであればワーニングの表示される
コマンドプロンプトもそこまで目立たず自動で消えるので
これなら実務でも使えそうである。
(いやあ、今回は諦めずに素人なりによくがんばったなあと自分で思う。)
最後にpyinstaller。
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ファイルである。
最終的には9MBまで減った。
(NSISの圧縮を介さない分、py2exeとcx_freezeよりは重めかな)
こちらも実務で使えそうだ。
目下、最大の課題は
ファイル容量だと思う。
(11/17追記)
→一応解決。
5〜9MBまで減った。
VBAだとウインドウハンドルの取得やsendmessageは
結構使えるようになったが、
メニューのクリックは
「階層」をたどるプログラミングがうまくできない。
menuiteminfo構造体とか、、うまく動くときと動かないときがある。
その点pythonのpywinautoはメニュークリックをここまで
簡単に、短いソースで扱えるのは便利だ。
exe化さえしなければかなり優秀といえる。
VBAに戻りたくなるが、、、今はpythonで粘りたいところである。
仕事効率化にはまだ遠いなあ。
(11/17追記)
→結構着々と進んでいる気がしてきた。
(py2exeのワーニングさえ出なければ文句ないのに。)
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/5626159
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック