アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2016年12月03日

pywinauto練習〜メモ帳で名前を付けて保存&Gist使ってみた〜

業務効率化したい。
何でも自動化して
(今のところ)自動化できないことに
時間を使いたい。
エクセルだろうがvbaだろうが
なんだって使ってやる。
pythonも戦力とするために
少しでも慣れようと思う。
pywinautoで前はCADソフトを起動して
名前を付けて保存していた。
それを違うソフトでやってみよう。

手始めはメモ帳である。

せっかくなので
ブログ記事内にソースコードを
埋め込むということにも挑戦したいと思う。

他のサイトでもよく見かける。
行番号付きでソースコードを見れる。
Gistというものが便利らしい。

Gistの使用やメモ帳の操作などなど
下記のサイトを参考にしてみた。

>林檎と珈琲 blogにソースコードを載せる(Gist編)
http://akio-t.hatenablog.com/entry/2015/05/05/163032

>さよならストレス Python と pywinauto で Windows の GUI 操作を自動化する
http://d.hatena.ne.jp/wwwcfe/20110317/pywinauto

>pywinauto Documentation Release 0.5.4
https://media.readthedocs.org/pdf/pywinauto-docs/latest/pywinauto-docs.pdf



苦労した点は
「SetTextだと1行しか書けない。(上書きされる)」
ということ。
複数行書く方法が分からなかったので下記の方法をとった。
 @SetTextで1行分書き込み、
  Typekeysで{ENTER}を送ることで
  改行した。
 ATextBlockで今入力されている入力済テキスト({ENTER}含む)
  を上書き前にtext2に格納し、
  pos_end=text2部分でtext2の後ろに追記する形を取った。
時間のあるときに関数化しておきたい。
(12/6修正)
関数化した。


これで一応、GUIを操作して
文章をメモ帳に書き込んで
保存(上書き含め)はできるようになった。

notepadsav01.JPG

現状の問題点としては、、

保存場所を指定したい。(パス)
.pyのある場所ではなく、最初にテキストファイルを保存した場所
に保存される。

これも勉強していけばすぐに解決されるだろう。


(12/6修正)
ファイル名の欄に
ファイルの絶対パスを打ち込むと
フォルダが存在する場合は指定フォルダに
保存できることが分かった。
(自分が気づいていないままこれまで生きてきただけなのだろう。。)

ただし、フォルダが存在しない場合はエラーになるので、
import osで
mkdirを使って
無いフォルダは作ってしまうことにした。
※参考にしたのは下記の2サイト。
>ファイルやディレクトリの有無を調べる
http://www.gesource.jp/programming/python/code/0008.html

>ディレクトリを作成する
http://www.gesource.jp/programming/python/code/0009.html

これでいかなる場合もどこのフォルダでもpywinautoで
GUIを操作してメモを保存できるようになった。
「pywinautoでGUIを操作して」
の部分が重要である。
あくまでGUIのメニューを自由自在に操作するのが
目標なのだから。
(単にテキストファイルを好きなフォルダに吐き出すだけなら
 vbaでもpythonでも簡単である。)

さらに、実用性を考えて、
pythonのスクリプトファイルのある場所に
ファイルを保存も選べるようにした。
スクリプトファイルのあるフォルダの絶対パスの取得は
下記のサイトを参考にした。

>Python で スクリプトのファイルパス を 取得する基本コード (メモ)
http://qiita.com/HirofumiYashima/items/fd8391d5cba1383da52e

pywinautoで「名前を付けて保存」ダイアログで
保存先フォルダを指定する、という内容を
書いたサイトが探しても探しても見つからなくて、、
諦めそうだったが、
結果的には単純な話だった。
スマートではないかもしれないが。

現状の問題点としては、、
続きとしては
メモ帳に書く文章も
配列(リスト)として関数に渡すようにしたい。


(12/7追記)
配列で関数に渡すように変更した。
メモ帳については
やりたいことはすべて完了した。


posted by iyoder at 21:52 | Comment(0) | TrackBack(0) | プログラム

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ファイルは下記のように変えた。

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) | プログラム

2016年11月13日

NSISでpy2exeとcx_fleezeを1ファイルexe化


前回の記事
>python3でpy2exe
https://fanblogs.jp/mountain4101/archive/58/0

では、pythonで書いたプログラムを
「pyinstaller」、「py2exe」、「cx_fleeze」
の3種類でexe化した。
その際、pyinstallerは1ファイルでexe化されたが、
py2exeは1ファイルや2ファイルで指定しても
必ず3ファイルで出力された。
cx_fleezeは5ファイルで出力される。

他の人も気軽に使えるようにしたいことを考えると、
1ファイルがいい。
「〇〇のフォルダに放り込んでダブルクリックしてくれればいいから」
と指示も簡単だ。

そこで前回記事の最後に書いた、
NSISというソフトでの1ファイルexe化を試みる。

調べるとNSISは
自作プログラムのインストーラを作るソフトのようである。
ただし、指定によっては
一時フォルダに展開して実行まで自動でするようにできるので
実質1ファイルのexeにまとめているようなものとのこと。
(下記のサイトの652に書かれている。)

>くだすれPython(超初心者用) その24
http://peace.2ch.net/test/read.cgi/tech/1407008551/

さらに調べると
NSISにはポータブル版があるとのこと。
自分はwinpythonを使っているので
NSISもポータブル版があるとありがたい。
早速下記のサイトからダウンロードする。

>PortableApps.com NSIS Portable
http://portableapps.com/apps/development/nsis_portable

Unicode版、ANSI版があるが
よくわからずUnicode版をダウンロード。
フォルダの移動がめんどくならないよう
winpythonのフォルダの直下にインストールした。
(C:\WinPython-64bit-3.4.3.6)

さあ1ファイルのexeを作ろう。

環境
・PC:surface pro (初代)
・OS:windows10(64bit)
・winpython3.4 (64bit)
・py2exe 0.9.2.2
(cx_fleeze 4.3.4)
・NSIS Portable Unicode 2.46.5 Rev 3

使い方を調べると
下記のサイトがあった。

参考サイト@
>NSISというのを使って、py2exeで作ったファイルを一つに見まとめてみた
http://blogs.yahoo.co.jp/topitopi38/1038112.html

リンク先の下記のサイトも記載しておく。
参考サイトA(オール英語です。)
>SingleFileExecutable
http://www.py2exe.org/index.cgi/SingleFileExecutable

参考サイトAにはsetup.nsiというプログラムが
2種類記載されている。
そのうち2つ目の方のコードをコピーする。
参考サイト@にも記載されているが、
最初の3行を自分の内容に書き換える。
(ファイル名はpy2exeのsetupファイルと紛らわしいので
setup_nsis.nsiとした。)

nsis01.jpg

1行目
!define py2exeOutputDir 'dist'
はpy2exeがexeを含む3ファイルを吐き出すフォルダ名である。
(このフォルダ内のファイルを1つにまとめることになる。)

2行目
!define exe 'test.exe'
setupファイルの隣にこの名前のexeファイル(1ファイル)が吐き出される。

3行目
!define icon 'C:\WinPython-64bit-3.4.3.6\python-3.4.3.amd64\DLLs\py.ico'
iconファイルのパスを示す。
ちなみにnsisで扱うパスは日本語が入っているとエラーになるようなので注意。
ここではpythonのファイルのicon。

参考サイトには書いてないが
4行目
;!define compressor 'lzma' ;one of 'zlib', 'bzip2', 'lzma'
これは「;」マークでコメントアウトする。
圧縮すると容量は半分くらいになるが、
完成したexeファイルを実行したときに
若干起動が遅くなる。
(解凍時間が含まれるためだろう。)


次にNSISの実行ファイル(makensis.exe)へのパスを通す。
環境変数のpathに
C:\WinPython-64bit-3.4.3.6\NSISPortable\App\NSIS
を登録した。

そしてコマンドプロンプトで
cdコマンドでsetupファイルのある場所に移動し、
「makensis.exe setup.nsi」
と打つ。
自分はめんどくさいのでbatファイルに書いてしまう。

nsis02.jpg

とうとう1ファイルのexeが
吐き出された。
さっそくexeファイルをダブルクリックすると、
いつものtextファイルが吐き出され、成功である。

ただ、、、、アイコンが
指定したpythonの.pyのアイコンじゃない。。。
ダサい。

PCとCDの絵がついた旧式のインストーラのアイコンである。

nsis03.jpg

ちなみにそのexeファイルを隣にコピペすると
コピーの方はpythonのアイコンに変わる。

何でだ?
と思って調べてみる。

参考サイトB
>アイコンが変わらない?
http://blog.syo-ko.com/?eid=1451

とそのリンク先のサイト

参考サイトC(参考サイトBのwindows8の場合のリンク)
>PC、ゲーム、ガジェットの紹介、PCトラブルシューティングの記録とか色々。
>Windows 8 で 変更したはずのアイコンが変わらない
http://eisen-japan.blogspot.jp/2013/08/windows-8.html

を見ると、
IconCacheというキャッシュファイルが
残っているせいらしい。

参考サイトCに書いてあるとおり
下記の画像のbatファイルを作成してみる。
(IconCacheファイルの種類は各パソコンの環境によって
異なると思うので、フォルダ内を確認してから作ってください)

nsis04.jpg

そして実行。

これでキャッシュファイルは消えた。
もう一度exeファイルを作り直してみる。

よし、pythonのアイコンになったぞ。
これで完成だ。

nsis05.jpg


では次に
cx_fleezeで同様のことをやってみよう。
下記の画像がsetup.nsiファイル(自分はファイル名をsetup_nsis.nsiとしている。)

nsis06.jpg

1行目
!define cx_fleezeOutputDir 'build\exe.win-amd64-3.4'
今度はpy2exeではないので
「cx_fleezeOutputDir」に変える。
cx_fleezeがexeファイルを含む5つのファイルを出力するフォルダを指定するので
「build\exe.win-amd64-3.4」となる。(自分のcx_fleezeの仕様による。)

42行目
File /r '${cx_fleezeOutputDir}\*.*'
こちらもpy2exeOutputDirからcx_fleezeOutputDirに変える。

そして
batファイルで「makensis.exe setup_nsis.nsi」
を実行。

nsis07.jpg

cx_fleezeでも1ファイルのexeファイル
を出力できた。

「pyinstaller」、「py2exe」、「cx_fleeze」
の3種類ですべて1ファイルのexe化ができるようになった。

個人的には
cx_fleezeはexeファイルをダブルクリックすると
一瞬だけコマンドプロンプトが立ち上がるのが
いやである。
まあ、一瞬だけなので、
他の性能が良ければ使ってもいいが。

1ファイルにした場合の各exeファイルの容量は五十歩百歩である。
・pyinstaller 4.97MB
・py2exe 5.53MB
・cx_fleeze 6.11MB

ほんとは速さを測定してみたいが
自分にはそのスキルはない。
まあ、今のところはそんなに差を感じない。
プログラムが複雑になったときに明確に差が出てくるだろう。

よし、今度こそ
役に立つexeファイルをたくさん作るぞ。



posted by iyoder at 01:22 | Comment(1) | TrackBack(0) | プログラム

2016年11月08日

python3でpy2exe

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

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

IMG_1513.JPG




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


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

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

>pywinautoとcx_freezeとpywin32の共存
https://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) | プログラム

2016年08月21日

WinpythonでAutocad

前に下記のサイト
>エクセルでAutoCADを自動作図させる方法
http://excelvba.info/index.html
を参考にVBAでAutocadを自動作図するよう
プログラミングした。
(下記の日記にも少し書いた)
>脱線につぐ脱線
https://fanblogs.jp/mountain4101/archive/37/0?1471709775

ただ、VBAをやめてPythonというかWinpythonに切り替えるつもりなので
WinpythonでAutocadの自動作図ができるよう
コードを書き換えようと思う。

で、本日試行錯誤の素人コーディングの成果はこんな感じ。
(起動しているAutocadに線を1本書くプログラム)

Autocad1.JPG


何をしているかというと、
acadcommand()関数とline1関数で
作図する命令一式を記載したacadcode.scrというテキストファイルを作成し、
送信することで作図している。

acadcode.scrファイルの中身は単純で
下記のような感じ。

Autocad3.JPG

で、test.pyファイルをダブルクリックすると
Autocad上に以下の写真のように線が引かれる。
ちゃんとレイヤも指定して。

Autocad2.JPG

たかが1本の線。
だけど、これで円、長方形、文字もレイヤを指定して書ける。
組み合わせれば複雑な図形も一瞬で好きな大きさで書けるようになる。

応用としては
計算プログラムから座標等を吐き出せば、
全自動で図面が書けるはず。
エクセル等で計算した際に、
openpyxlで寸法を読み込み、
一緒にcad図面を吐き出すなんてこともできるだろう。

便利な作図プログラムを沢山作りたい。



posted by iyoder at 01:13 | Comment(0) | TrackBack(0) | プログラム

2016年08月18日

winpythonにしよう

pythonを使い始めたが、
このまま知識をつけていっても
結局今のsurface proでしか使えないものが
できあがるのではないか?
cx_freezeでexe化するしかないんだけど。

そこで今のpythonをやめて
winpythonに変えようと思う。
レジストリに依存しないポータブルなpythonらしい。
USBに入れて持ち運べるようだ。
科学技術計算に必要なモジュールが
最初から入っているようだ。

調べてみると下記のサイトにインストールの仕方が書いてある。
>ねこゆきのメモ
のインストール。
http://nekoyukimmm.hatenablog.com/entry/2015/03/02/095750

レジストリの設定(ボタン1つクリック)と
環境変数のPathの設定(2つ)をしてるから
違うPCにコピーして使おうとしたら
この2つだけはしないといかんのだろうな。


※(8/21追記)
 上記サイトのまま環境変数のPath設定したら
 python.exeにPathが通ってなかったので
 「C:\WinPython-64bit-3.4.3.6\python-3.4.3.amd64」
 もPathに加えた。→ダブルクリックで.pyファイルが実行できるようになった。


ということで
標準のpythonをアンインストール。

そしてwinpythonにはSpyderと呼ばれる開発環境があるようなので
テキストエディタとして使っていた
SublimeTextもアンインストール。

で先ほどのサイトに従い
winpythonの3.4.3.6をインストール。
Register Distributionをクリック。
環境変数のPathも設定。

winpythonはpipも使えるらしい。
インストールしたフォルダ内に入っている
WinPython Command Prompt.exeから
winpython用のコマンドプロンプトを起動。

pip install openpyxl

あれ、、エラー。なんでだろ。


。。。そして2日が経過。

もう一度pip install openpyxlしてみると
なぜかメッセージが変わってる。
pipが最新じゃない、とさ。
環境変数変更後にパソコンを再起動したからかな。
まあいいや。
pipを最新にし、openpyxlも無事インストール完了。


そして試しにtest1というファイルから数値を読み取り
値を変えて別のエクセルファイルtest2を吐き出してみる。


test1はこんな感じ。

excel操作.JPG


こんな感じのコードを
書いてみる。

excel操作3.JPG


そして実行。
吐き出されるtext2.xlsxはこんな感じ。

excel操作2.JPG


よし。
うまくいった。
はじめは簡単なことしかできない。
が、一度プログラミングしたことは2度と自分でしなくていい。
仕事効率化には程遠い。
が、一歩一歩できること増やそう。

そうだな、、次はpythonでautocad操作してみたいな。


posted by iyoder at 17:27 | Comment(0) | TrackBack(1) | プログラム

2016年08月13日

pythonでエクセル

とある理由で我が愛機Surface Proを1日操作する時間が生じた。
最近はめっきりネット検索とYou Tubeしか使っていない。
なぜなら
4月から7月末までのダイエットによる山登りと皇居ラン、糖質制限、
ワンダーコアスマート、シックスパッドの購入・継続使用
7月末からのPokemon Goによるウォーキング
と興味・関心が体を動かすことに移ってしまっていたのだ。

2016-05-01 22.06.52.jpg




2016-06-05 20.20.16.jpg



結果、4月頭に78kgにまで膨らんだ体重は7月末で64kgまで減り、
多少米を食べ始めた今でも65sである。
ちなみにPokemon Go は現在122種類。(8/13現在)
あと20種類でコンプリートだが、10kmたまごが全然でないので、
たぶん無理そう。
と余談はここまで。

強制的にパソコンに向かう時間が生じたので
pythonでエクセルを操作してみることにした。
仕事効率化の第1歩である。
vbaではある程度の計算はできるが、
pythonに乗り換えたい。意味があるかは別として、
新しいことにチャレンジしたい。

ということで早速、下記のサイトを参考に
pip install xlwt
でxlwtをインストール

>python -ism
http://www.python-izm.com/contents/external/xlwt.shtml
>Excel書き込み (xlwt)

>python
>xlwt 1.1.2
https://pypi.python.org/pypi/xlwt

で上記pythonの公式サイトにあった例題を打ってみる。

xlwt.JPG

そして実行。

xlwt2.JPG

すごい。
ほんとにvbaみたいだ。
(ただ、列幅の自動調整がされてないのでそこだけ手動)

セルに値さえ打ち込んだり、
値をpython側に読み込めさえできれば
内部計算自体はすべてpythonで行えばよいわけだ。

だけど、
使ってみて1点気づいた。
保存するときの拡張子がxlsなので
試しにxlsxにしてみたら
吐き出されたxlsxファイルを開こうとすると
エラーで開かない。。。
今仕事で使っているファイルはすべてxlsxだから、
なんとかならないかなあ。

調べてみると
下記のサイトにまとめられていた。
>My Future Sight for Past
>PythonのExcelファイル(xls/xlsx)の読み書きモジュールまとめ
http://myfuturesightforpast.blogspot.jp/2014/05/pythonexcelxlsxlsx.html

ふむふむ、
やはりxlwtはxlsxへの書き込みが
できないんだな。
残念。

よくわからないけど、グラフを使わないなら
とりあえずPyOpenXLでいいんじゃないかなあ。
グラフ化より計算がメインだし。

ということで
pip install pyopenxl
と打ってみる。。。

あれ?

エラー。。。(涙)

調べるがよくわからない。
そしてPyOpenXLと書いてあるサイトと
openpyxlと書いてあるサイトと
両方がごちゃ混ぜになって書かれているサイトがある。。

諦めて、
pip install openpyxl
と打ってみる。
そしてopenpyxlがインストールされたのであった。
(そう、自分はopenpyxlと向き合っていくしかない。合ってるのかだろうか。。。)

心配していてもしょうがないので
いざ実践。
下記のopenpyxlの公式サイトにある
例題をそのまま打ってみる。

>openpyxl
https://openpyxl.readthedocs.io/en/default/

openpyxl.JPG

そして実行。
お、xlsxファイルが隣に吐き出された。
(すごいなあ、と思うのは、
エクセルのプログラムを立ち上げなくてもxlsxファイルが隣に吐き出されるところだ。
テキストファイルと同じ感じで吐き出してくれる)

openpyxl3.JPG

そして開くときちんと打ち込まれている。
(列幅の自動調整がされてないのでそこは手動)

これはほんとに計算だけならvbaの代わりになる。
よしよし。
posted by iyoder at 13:26 | Comment(0) | TrackBack(0) | プログラム

2016年03月20日

pywinautoでGUIのメニューをクリック

pywinautoで何がやりたいか。
それはWINDOWSのGUIのメニュー操作。

半年前はExcelのVBAのwin32API関数でやろうとしたが、
途中で挫折した。
メニューバーに並んでいる「ファイル」とか「編集」とか
のハンドルの取得まではできたが、
その先の「名前を付けて保存」とかまで行くのに上手くいかなかった。
結局メニューのクリックはできずに終わった。。。力不足。

それでpythonのpywinautoに目を付けた。
そしてやっと、試行錯誤の上、CADソフトのメニューを自動操作して
名前を付けて保存に成功した。
以下はそのコード。
環境は
PC:windows10(64bit)
python3.4 (64bit)
pywinauto0.5.4
(操作してるソフトは32bit)

# -*- coding: utf-8 -*-

def test(app1,pass1):
try:
app1.Connect(path = pass1)
except:
app1.Start(cmd_line = pass1)


if __name__ == "__main__":
import pywinauto
from pywinauto.application import Application

#アプリ起動
app = Application()
pass1 = u"C:\Program Files (x86)\AutoCAD 2007\\acad.exe"
test(app,pass1)

dialog = app[u".*名前を付けて保存.*"]
if dialog.Exists() == False:
pwin = app.window_(title_re = "AutoCAD.*")
MenuItms = pwin.MenuSelect("ファイル->名前を付けて保存")

# ファイル名を設定
dialog.Edit1.SetText(u"test01.dwg")

# 保存ボタンをクリック
dialog_button1 = dialog[u'保存(&S)']
dialog_button1.Click()
# 上手くクリックを認識しなかった時用に再クリック
if dialog_button1.Exists():
dialog_button1.Click()

# 同名のファイルが存在した場合(上書きする)
confirm = app[u".*名前を付けて保存.*"]
confirm_button1 = confirm[u'はい(&Y)']

if confirm_button1.Exists():
confirm_button1.Click() #上書きする

名前を付けて保存3.JPG

名前を付けて保存4.JPG

流れとしては
@ソフトが起動していれば接続。起動してなければ起動。(関数にした)
A「名前を付けて保存」ダイアログが開いてなければメニューから選択して開く。
Bファイル名をセット。
C保存ボタンを押す。
D同名のファイルがあれば上書きするか求められるダイアログが開く。
 (「はい」ボタンがあるかでif文で認識させた。)
保存終了。

ポイントとしては、たまたま起動するexeファイルの頭文字が「a」だったので「\a」で
別の符号みたいに認識してしまうので「\\acad.exe」としたら回った。

これを応用していけば、メニューはクリックし放題。
できることの幅が広がった!
posted by iyoder at 17:56 | Comment(1) | TrackBack(0) | プログラム

2016年02月28日

pywinautoとcx_freezeとpywin32の共存

念願のpywinautoをインストールしようと思う。
windowsの自動化だ。

検索するとver.0.4.0がよく出てくる。
これが最新版なのかな?
>sourceforge python win32 automation
>https://sourceforge.net/projects/pywinauto/files/

もう少し根気よく検索していくと
ver.0.4.2で記載しているサイトを見つける。
英語だけど、、、公式サイトかな?
でもダウンロードページに行くと、
さっきと同じ0.4.0のダウンロードサイトに行くようだ。
>pywinauto 0.4.2 documentation
>http://pywinauto.googlecode.com/hg/pywinauto/docs/getting_started.html

もっと調べていくとpipでインストールできると
書いてあるQ&Aを見つける。
pythonの3系もバンドルされている、とある。
(バンドルの意味はわからないが、、)
>yahoo知恵袋 pythonのpywinauto-0.4.0のインストールについて質問です。
>http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14147728284

pipとは何ぞやと思いながら、そのページに書いてある
pip install pywinautoというコマンドを
コマンドプロンプトに打ってみる。

するとコマンドプロンプトの画面にたくさん文字が出てきて
よく見ると0.5.4と書いてある。
どうやら最新版は0.5.4のようだ。

pipとはpythonのパッケージをインストール、アンインストールする
仕組みのようだ。
(pip uninstall パッケージ名でアンインストールもできるようだ)
よしこれでついにpywinauto をインストールしたぞ。

ということで、下記のサイトを参考にして
さっそくサンプルコードを書いてみる。
>necoakの日記 pywinauto で、pythonでWindows GUI 自動化の試み
http://d.hatena.ne.jp/necoak/20120917/1347866653

from pywinauto import application
app = application.Application.start("C:\Program Files (x86)\Internet Explorer\iexplore.exe")

拡張子は.pyでいいのかな。pythonだし。
とりあえずauto01.pyで保存。
で、コマンドプロンプト上でcdコマンドを使って、
ファイルのあるフォルダに移動し
python auto01.pyコマンドで実行。

あれ?回らない。
win32apiがない、と表示される。
どういうことだ。。

win32apiがない.JPG

検索して調べると、pywin32という
パッケージをインストールする必要があるようだ。
pipで入れようと試みるが、コマンドを打っても入らない。
下記のサイトのpywin32-220.win-amd64-py3.4.exeをダウンロードしてインストール。
>sourceforge Python for Windows Extensions
https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/

そして、もう一度実行(python auto01.py)

、、、回らない。
今度はソースのstart関数にcmd_lineというものが足りてないらしい。

cmd_lineが足りない.jpg

検索し続けた結果、
下記のように書き直してみた。
ちゃんとcmd_lineも書いてある。

from pywinauto.application import Application
app = Application().Start(cmd_line=u'"C:\Program Files (x86)\Internet Explorer\iexplore.exe" ')

実行!(python auto01.py)

やったー成功。
今となっては懐かしいinternet explorerが起動。

internetexplorer起動.jpg

「32bitプログラムは32bit pythonで自動化すべき(あなたは64bit pythonを使っているけど)」
というwarningが出てるけど、まあ気にしない。
時代は64bitパソコンに移行してるんだから。


で、全てが上手くいったように思えたが、、、

前回「HelloWorld」とテキストファイルに出力するだけの
pythonプログラムを書いて、cx_freezeを使ってexeファイル化したが、、
>pythonでexeファイルを作ろう
https://fanblogs.jp/mountain4101/archive/48/0

pywinautoとpywin32を入れた後に、
上記テキストファイル出力プログラムを再度exeファイル化しようとしたら、、、

エラー。

exeファイルとpython34.dllファイルはできたが、
他のファイルが吐き出されなくなった。

cx_breeze_error2.JPG

exeファイルをダブルクリックしてもエラーで動かない。

えー、ということはpywinauto・pywin32による自動化と
cx_freezeによるexe化の両方を実現することはできないということ!?

そんなアホな話があってたまるか。

cx_breeze_error.JPG

エラー部分を見ると、
C:\Python34\Lib\site-packages\win32\libのフォルダにある
「win32verstamp.py」というファイルの123行目でエラーが起きているらしい。

で、調べた。
日本語のサイトには書いてない。
英語のサイトもたくさん見た。英語苦手だけど。
で、下記のサイトにたどり着く。

>[python-win32] win32api - small patch for win32verstamp.py
https://mail.python.org/pipermail/python-win32/2014-December/013327.html

「if not ofn:」を「if ofn is None:」に直せということか?
確かにwin32verstamp.pyの129行目に「if not ofn:」があるので
「if ofn is None:」に書き換えてみる。

そして、テキストファイル出力プログラムを再度exe化してみる。。。
やったー回った。

exeファイル復活.JPG

test.exeファイルを実行すると
前回同様、ちゃんとHelloWorldと書かれたテキストファイルが出力された。

今回はさすがに無理かと思ったけど、
海外にはちゃんと先に悩んで解決した人がいるんだと思った。
これでpywinauto・pywin32とcx_freezeを共存させることができた。

自動化のプログラムをたくさん作ろう。





posted by iyoder at 16:04 | Comment(0) | TrackBack(0) | プログラム

2016年02月21日

pythonでexeファイルを作ろう

高級言語。
実行速度は遅いが同じ内容を少ないコードで実現できる。
流行りのRubyとPythonのどちらにしようか悩んだ。

芸能人でRubyの女神の池澤あやかを見習ってRubyにしようかとも思ったが、
自分はエンジニア。豊富な科学技術計算ライブラリをもつPythonの魅力は捨てがたい。
車輪の再発明は避けなければならない。
Pythonをインストールすることにした。

何も考えず一端は(2/21現在)最新版のPython3.5.1をインストールしたが
3.5は対応していないモジュールが多いので、アンインストールして
Python3.4.4をインストールした。
((2/21現在)3.5はexeファイルを作る方法がない。
 HCpy-Standalone-Bというソフトでできるようだが、
 ダウンロードしようとしたらWindows Defenderによるウイルスチェックではじかれた。)
exeファイルにできないと、PythonをインストールしているこのSurface Pro以外で使えない。
もし有用なプログラムを書いたら、仕事でも使いたい。
そのためにvisual studio 2015を使うのをあきらめたのだから。


ということで下記のサイトを参考にインストール完了。
>windows環境へのpythonインストール
http://qiita.com/maisuto/items/404e5803372a44419d60


Python2.xでexeファイルを作成する場合はpy2exeというモジュールで
簡単にexeファイルが作れたらしい。
Python3.x系統ではcx_freezeというモジュールを使うようなので
下記のサイトからダウンロード。→インストール
>Python Software Foundation cx_Freeze 4.3.4
https://pypi.python.org/pypi/cx_Freeze/4.3.4


さあ、初めてのコードを書こう。
テキストエディタに下記のコードを記載し、「test.py」として保存。
「HelloWorld」と書かれたtext01.txtというファイルを出力するコードだ。
pythonは高級言語だけあって、変数の型を宣言する必要はない。

a = 'Hello '
b = 'World'
c = a + b

fout = open('text01.txt', 'wt')
fout.write(c)

fout.close()

これをコマンドプロンプトからcdコマンドでtest.pyのあるフォルダに移動して
python test.py
というコマンドを実行すれば
テキストファイルが隣に出力される。


せっかくだから今まで覚えたBATファイルの知識を使ってみる。
テキストエディタに下記のように記載し、「testpy.bat」という名前で保存する。
@rem エコーを出力しない
@echo off

rem BATのあるフォルダに移動し.pyファイルを実行するBAT

rem 現在のフォルダに移動
cd /d %~dp0

python test.py

pause
exit

BATファイルのあるフォルダからの相対パスにしたい場合は
「python test.py」部分を
「python test1\test.pyとすれば、test1フォルダ内のtest.pyを実行する。
(pauseは必要に応じてremでコメントしてもよい)

テキストファイルへの入出力は下記のサイトを参考にした。
>今さらPython3 (49) - テキストファイル入出力
http://deutschina.hatenablog.com/entry/2016/01/26/013000

※後日、test.pyをダブルクリックするとコマンドプロンプトを介さなくても
 実行されることに気付く。。。。Batファイル要らないね。


さて、次にexeファイルの作成だが、
テキストエディタで下記のように記載し、「setup.py」という名前でtest.pyと同じフォルダに保存。
import sys
from cx_Freeze import setup, Executable

includes = []

base = None
if sys.platform == "win64":
base = "Win64GUI"

setup( name = "",
version = "",
options = {"build_exe": {"includes": includes}},
executables = [Executable("test.py", base=base)])

setup.pyの作成方法については
下記のサイトを参考にした。
>みーのぺーじ Pythonをcx_Freezeでexeにする (windows編)
http://pc.atsuhiro-me.net/entry/2013/01/21/000000_1

で、上記サイトは32bit版で記載しているが
自分はSurface proで64bit版のpythonをインストールしているので
5行目から6行目は
「if sys.platform == "win64":
base = "Win64GUI"」とした。
あと、上記サイトではPyQtというQUIに使うモデュールを取り込んでいるが、
自分の数行のコードは特に取り込む必要のあるモデュールもないので
「include」部分は空欄として「 includes = [] 」とした。

で、コマンドプロンプトからcdコマンドで
test.py、setup.pyと同じフォルダに移動し、
python setup.py buildというコマンドを実行すれば、buildフォルダができあがる。
中にはきちんとexeファイルができており、
実行すれば「HelloWorld」と書かれたテキストファイルがexeファイルの隣に出力される。

build.JPG

テキストファイル.JPG

上記も面倒なのでBATファイルを作ってしまうと、
テキストエディタで下記のコードを記載し、「setup.bat」として
test.py、setup.pyと同じフォルダに放り込む。

@rem エコーを出力しない
@echo off

rem BATのあるフォルダに移動し.pyファイルを実行するBAT

rem 現在のフォルダに移動
cd /d %~dp0

python setup.py build

pause

exit

setup.JPG

BATファイルを実行すれば、同じ場所にbuildフォルダができあがるという訳。
これでpythonのプログラミングが始められるようになった。
よしよし。

目標としては、「pywinauto」という機能で、
windowsを自在に操ること。
それまで地道に勉強しよう。
posted by iyoder at 21:17 | Comment(0) | TrackBack(0) | プログラム
最新記事
<< 2021年01月 >>
          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日以上新しい記事の更新がないブログに表示されております。