つらねの日記

プログラムの進捗やゲームをプレイした感想などを書き連ねる日記。

コマンドラインでpywinauto しようとしたときのまとめ

前置き

いつもはcygwin を使っているのだが、pywinauto を使おうとしたら、なぜかできず、調べたところcygwin ではできないらしい。ctypes もできなかったのでだめっぽい。というわけでコマンドラインからpython を動かそうということになった。

install python

www.python.org
ここからpython2.7.10 Windows x86-64 MSI installer を落とした。
設定は特に変えず入れた。
環境変数

C:\Python27
C:\Python27\Scripts

を追加


about easy_install & pip

easy_install & pip を入れようとしたらすでに入っていた。
しかしpip が古いと言われたので

$ pip install --upgrade pip

確認

$ pip -V
pip 7.1.0 from C:\Python27\lib\site-packages (python 2.7)

新しくなった。

install ipython

デフォのpython は補完が弱くて死ぬのでipython を入れる。

$ pip install ipython
Collecting ipython
  Using cached ipython-3.2.0-py2-none-any.whl
Installing collected packages: ipython
Successfully installed ipython-3.2.0

入った。
実行したら色もないし補完もゴミだった。

d.hatena.ne.jp
pyreadline が必要らしい。

$ pip install pyreadline
Collecting pyreadline
Installing collected packages: pyreadline
Successfully installed pyreadline-2.0

入った。強くなった。

install pywinauto

$ pip install pywinauto
Collecting pywinauto
Collecting pypiwin32 (from pywinauto)
  Downloading pypiwin32-219-cp27-none-win_amd64.whl (7.3MB)
    100% |################################| 7.3MB 49kB/s
Installing collected packages: pypiwin32, pywinauto
Successfully installed pypiwin32-219 pywinauto-0.5.0

入った。


一回入らなくてpypi.python.org
とかgithub.com
から入れたりしたことがあったが、状況を再現できなかった。
pywin32がどうとか言われてた記憶があるので入れたかもしれない。
Python for Windows Extensions - Browse /pywin32/Build 219 at SourceForge.net

use pywinauto

$ ipython
In [1]: from pywinauto.application import Application
In [2]: app = Application.start("NotePad")
In [3]: app_form = app.top_window_()
In [4]: app_form.Minimize() # 最小化してみる
In [5]: app_form.Restore() # 戻す
In [6]: app_form.print_control_identifiers() # なにがいじれるか?
Control Identifiers:
Edit - ''   (L-32000, T-32000, R-31316, B-31476)
        '' '0' '1' 'Edit' ()
In [7]: app_form.Edit.SetText("This is a pen.")
In [8]: app_form.Edit.CaptureAsImage()
PIL does not seem to be installed. PIL is required for CaptureAsImage

PIL がないらしい。

install PIL on windows

$ pip install PIL
Collecting PIL
  Could not find a version that satisfies the requirement PIL (from versions: )
  Some externally hosted files were ignored as access to them may be unreliable (use --allow-external PIL to allow).
No matching distribution found for PIL

$ pip install PIL --allow-external PIL
Collecting PIL
  Could not find a version that satisfies the requirement PIL (from versions: )
  Some insecure and unverifiable files were ignored (use --allow-unverified PILto allow).
No matching distribution found for PIL

$ pip install PIL --allow-external PIL --allow-unverified PIL
Collecting PIL
.
.
.
    error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat).
Get it from http://aka.ms/vcpython27

なんかだめっぽい。

http://aka.ms/vcpython27から Microsoft Visual C++ Compiler for Python 2.7 を落とした。
設定は変えるところがなく入れた。

retry install PIL

途中でこんな記事を見つけた。
python - About the PIL Error -- IOError: decoder zip not available - Stack Overflow
PILではなくてPillowを使うといいらしい。

$ pip uninstall PIL
$ pip install Pillow

retry pywinauto to screenshot

先ほど起動したNotePadがあるはずなのでそれ検索して再利用する

In [1]: import pywinauto
In [2]: app = pywinauto.application.Application()
In [3]: app_form = app.window_(title_re = u".*メモ帳.*")
In [4]: app_form.Exists()
Out[4]: True
In [5]: app_form.CaptureAsImage().show()

Q: 真っ暗な画面が出てきた。なんで???
A: メモ帳を最小化していたからだった。どうやら最小化したままではスクリーンショットは取れないらしい。

In [1]: import pywinauto
In [2]: app = pywinauto.application.Application()
In [3]: app_form = app.window_(title_re = u".*メモ帳.*")
In [4]: app_form.Restore() # ここで最前面でなくしてみた。
In [5]: app_form.CaptureAsImage().show()

f:id:turane_gaku:20150711151319j:plain
直接描画をとってくるのではなくてあくまでそのウィンドウ範囲内の画像を撮るというようだ。

まとめ

pywinauto.controls.HwndWrapper — pywinauto 0.4.2 documentation
色々なことができるようだ。これだけあれば当初やりたかったことは問題なくできるかなというところ。

c++ で実行ファイル作ってpythonJavaで呼ぶだとか、ctype やJNAでwin32api を叩くとかいうプランも考えていたが、それより簡単にできそうなので喜ばしい限りだ。