PyAutoGuiを試す

■ 概要

本来やりたいことが行き詰まったのでGUI操作自動化の味見をした。

Windows7(32bit) + Python3.6.1とでPyAutoGuiを利用して、単純なマウス操作とキーボード操作ができることを確認し、おおむね満足した。

■ 参照記事

公式(多分) の最新ドキュメントと、下記blog記事を参照してさっくり試した。

whitecat-student.hatenablog.com

www.slideshare.net

 

■ 試行手順

インストールは"pip install pyautogui"で一発。

まずはインタラクティブシェルでマウスカーソルを画面左上に動かしてみる。

  >>> import pyautogui

  >>> pyautogui.moveTo(x=100, y=200)

うまく動いた。

画面サイズの最大値は"pyautogui.size()"で求まるので、後は適当に座標計算すればどこにでも飛べるはず(マルチディスプレイ環境でどうなるかは不明)。

 

キーボード操作も模擬できる。使えるキー名は"pyautogui.KEYBOARD_KEYS"を表示させることでわかる。というわけで試す。

  >>> pyautogui.press(["ctrl", "alt", "delete"])

  >>> pyautogui.hotkey("ctrl", "alt", "delete")

…どちらもうまくいかない…。特殊キー操作だからダメなのか?

  >>> pyautogui.press("a")

は当然のように期待通り動いた。

  >>> pyautogui.press("numlock")

も動くので、なんちゃってLチカもできる。

 

とりあえず初回の試行としては満足した。

ただ、他アプリ操作は自前環境なら起動時間待ちなど試行錯誤でどうにかなりそうだが、Win32API利用なしで一般化できるのかは今後の課題。 公式ドキュメントなどに記載があるように、バグって暴走するのも怖い。

また"pyautogui.locateOnScreen()"を使うと、与えた画像ファイルと一致する画面表示座標を返してくれるようだが、透過画像に対してはうまく行かないことがあるようだ。ブラウザ上の透過画像をファイル保存して与えてみたが、Noneが帰ってきてしまった。このあたりは割り切るべきなのかもしれない。

 

我が家に地球儀がやってきた

■ 概要

「リプルーグル 地球儀 クランブルック型 アンティーク 日本語版 31470」を入手した。大変楽しい。

f:id:Huck:20170820165130j:plain

■ 入手までの四方山話

子供の頃から地球儀は好きだった。できれば東京大学総合研究博物館にある直径数メートルの巨大地球儀を自室に置けたらどれほどかと思う。ただ自室に置くとすると、サイズ選定は将来の生活スタイル変更も織り込んで慎重に行う必要がある。

というわけで、形式選定。Webにはニッチな情報がなく、限界を感じる。とりあえず近所の丸善で地球儀フェアをしていたときに現物チェックし、判断の一助とする。

形式が決まっても、今度は英語版と日本語版の間で迷う。日本語版は古いのが実家にあるから英語版に挑戦してみたい反面、Web上の画像を比較する限りでは、可読性の点で日本語版の方が明らかに優れている。悩む。しかし悩み抜いた末、英語版がヤードポンド法準拠と知って切り捨てる。山の高さや海の深さがフィート表示って、メートル法で生活している人にとってそれはどうなんですかね。

 

■ 入手後のあれこれ

所望の品は、結局日本半周して我が家にやってきた。通販の定めとはいえ複雑なものを感じつつ開封の儀を執り行う。おお、なかなか良いではないか。設置性に一抹の不安を感じてはいたが、台座のサイズがさほどでもなかったので、結局問題なかった。

そうして世界中眺め回しているうちに、北極点にタイムスケールがあることに気づいた。このスケールを回して、現在地の時刻に合わせれば、各緯度の時間がわかるという原理的なスケールである。国や地方によって標準時は異なるが、これはこれでわかりやすいので良い。子供への教育の一助にもなるだろう。

 

ただ全てが素晴らしいわけではない。現在地から見た東西方向の感覚は、目の錯覚の関係か、どうも地球儀より正距方位図法の方がしっくりくるようだ。これは電波伝搬を考える上で 少々苦しい。十字シールを作って地球儀に貼れば良いという話題も目にしたが、率直に言って美しい解とは思えない。つまり、二次元平面の地図にも、地球儀にも、それぞれ見方として優れているところがあるのであって、地球儀があれば地図は不要と言うことにはならないわけで、まあ両方使い分けましょうというのが落としどころのようである。

 

ただそれでも私は地球儀が好き。

 

あ、地図は地図で大好きですよ。比べるのが野暮と言うことに今更気づいただけ。地球儀を眺めて、気になった土地をWeb地図や航空写真で見直してみると、新たな発見あるある。

地球儀をくるっと回してたまたま停まった土地、たとえばミクロネシアのサワタン島とかいかがでしょうか。Web上の写真を見ながら、そこにどうやって行けば良いのかとか考えはじめると…。

Pythonでデジタル地図に色々プロットするための準備 その2

■ 概要

 Basemap公式サイトのインストール手順に則らず、非公式パッケージを利用したらBasemap利用環境があっさり整った。ドキュメンテーションがしっかりしていない公式サイトは滅びるべきである。

■ はじめに

公式の説明書きにしたがってうまくいかなかった上にストレージ容量を無駄に食いつぶされたので、ひとまず余計なものを消しにかかる。

…と思ったら"OSGeo4W"のアンインストーラが見当たらない。スタートメニューにあるsetupプログラムからはインストールしかできない。かといってWindows標準の「プログラムのアンインストール」に項目があるわけでもない。酷い。今時のインストーラならもう少し気のきいた振る舞いをして欲しかった。しかし仕方ないので直接ファイルを削除。レジストリ環境変数は特に設定されていなかったのでそのまま。

 ■ 再出発

もう公式は信じられないので、下記サイトを参考に非公式wheelからのpyprojとBasemapのインストールを試みる。

blog.livedoor.jp

 

% pip install pyproj-1.9.5.1-cp36-cp36m-win32.whl

% pip install basemap-1.1.0-cp36-cp36m-win32.whl

 …両方とも特にエラー無く終了。昨日の苦労は一体…。

 

■ 備忘

"pip list"した結果は下記の通り。備忘のため記録。

basemap (1.1.0)
cx-Freeze (5.0.2)
cycler (0.10.0)
flake8 (3.3.0)
matplotlib (2.0.2)
mccabe (0.6.1)
numpy (1.13.1)
olefile (0.44)
Pillow (4.2.1)
pip (9.0.1)
pycodestyle (2.3.1)
pyflakes (1.5.0)
pyparsing (2.2.0)
pyproj (1.9.5.1)
pyshp (1.2.11)
python-dateutil (2.6.1)
pytz (2017.2)
pywin32 (221)
selenium (3.4.3)
setuptools (28.8.0)
six (1.10.0)
wxPython (4.0.0b1)

Pythonでデジタル地図に色々プロットするための準備 その1

■ 概要

 アーアアアアアアア!アーグブイ!アーグシー!

■ はじめに

ざっくり調べたところ、2017年7月現在、Pythonでデジタル地図を扱うには"basemap"パッケージが主流のようだ。他にはイギリス気象局がリリースしている"Cartopy"がある模様。ただ今回はまず初めての準備なので、主流に合わせていく。

興味をそそられる例を挙げていて、説明も必要十分そうに見えた下記サイトを参考に進めることにした。

qiita.com

qiita.com

basemapやcartopyで地図上でplot | mwSoft

 

 

■ 前座:各種パッケージインストールは多分成功

ほぼPython3.6.1(Windows7, 32bit)入れただけの環境から出発する。

インストール手順は公式を参照するのが最善という経験則から、この時点では日本語解説記事はまだ参考にしない。まずはグラフ描画ライブラリ"matplotlib"から。

% pip install matplotlib

で下記パッケージが一度に入った。

  • cycler-0.10.0
  • matplotlib-2.0.2
  • numpy-1.13.1
  • pyparsing-2.2.0
  • python-dateutil-2.6.1
  • pytz-2017.2

numpyは1.2.1より新しいものを入れろ、と公式には書いてあったが、1.13.1って新しいと見ていいのかな?小数点表記内の桁上がりでバージョン表記されるといつも迷う。

次に"PROJ4"と"GEOS"をインストールする。"pip search geos"とやると*geos* 0.2.1が入るだろうことがわかるが、最新のリリースは3.6.2なので罠だろう。こういうのやめてほしい。

Windowsインストール用バイナリを探すと、どちらも"OSGeo4W"の一部として配布されているようだ。これだと今使わないものまで一緒に入ってくる気がしたが、他に妙案も出なかったのでWeb install。カスタムインストールとして、ライブラリ名検索窓に"PROJ4", "GEOS"と入れてフィルタされたものだけチェックして実行。関連パッケージ含めてインストールには少々時間がかかった。というかPython本体とか色々入れられていたような…システムディスクのSSDがだいぶ圧迫されてきたぞ。

さておき、オプション扱いされていたが必要そうなので画像処理ライブラリ"Pillow"も入れておく。

% pip install pillow

これは簡単。

■ 本題:basemapインストールに失敗

いよいよbasemap本体のインストールに取りかかる。

公式の説明書きにはWindowsインストーラバイナリがあるかのように書かれているが見つからないので大人しくソースコードを入手してビルドする。GitHubのリポジトリから延々110MBダウンロードして、setup.pyにgeos_c.hの一つ上のディレクトリ階層を追記してから

% python setup.py install

を実行。

No module named 'numpy.distutils._msvccompiler' in numpy.distutils

(中略)
error: Command "cl.exe (中略) /Fobuild\temp.win32-3.6\Release\src/_geoslib.obj" failed with exit status 127

 

 "numpy-1.13.1+mkl-cp36-cp36m-win32"を代わりに使ってみても状況は変わらず。次回持ち越しとする。

■ 所感

最新のPythonで気軽に何かやってみたいと思ったとき、関連パッケージがpipで扱われていなかったらいったん立ち止まるべきなのかもしれない。pip偉大。

自宅Windows PCへのPython3.6セットアップ その2

■ 概要

wxPythonのインストール失敗は運の要素に左右されたが解決した。

wxPython 4.0.0b1のインストールに成功

昨日散々苦労して入らなかったwxPython、ちょうど同日に新しいバージョンがリリースされ、本日改めてpip install -U wxpythonしたら何の問題も無くインストールが完了した。なんということでしょう。

自宅Windows PCへのPython3.6セットアップ その1

■ 概要

Python3.6系にwxPythonを入れようとして苦労した。結局解決せずに次回持ち越し。

■ はじめに

どうも仕事でPythonを使って色々試してみるには大人の事情が邪魔することが多いので、自宅Windows PCにもPythonを入れてみることにした。というか前々から入れていたのだが真面目に使ってなかったので、この際最新版(Python3.6系)を試してみようと思ったのだ。

ついでにパソコン周りでどうにかする雑用を片付けやすくするため、あとかねてから手を出してみたいと思っていたGUI周りに近づくため、いくつかパッケージを追加することにした。具体的には"pywin32", "selenium", "wxPython"である。それから仕事場でどうしても期待通り動いてくれないでいる"cx_freeze"もいじってやろうと思う。 さらには"flake8"も。LINTは大事よね。

■ Python3.6.2を試す

 pywin32はあいかわらず.exe形式のインストーラを使わないとダメらしいので、素直に公式からダウンロードしてきて実行→成功。

seleniumはpip installであっさり入る。

しかしwxPythonはpipではうまく入らず、ソースコードからビルドしてやっても粗雑に進めたせいか、一見インストールされたように見えてimport wxでエラーとなる。

以前どこかでPython3.5系にはうまく入ったような記憶があるので、下手に最新版に手を出した代償かなー、と思いつつ、ちょっとだけWebで情報収集。

…30分くらい試行錯誤してたら子供がぐずりはじめたので中止。Python3.6.2は2017年7月リリース版である。ちょっと攻めすぎたかと思い、後戻りすることにした。

■ Python3.6.1を試す

./Python36/scripts/以下にpipがあるのだが、pip3(Python3系のためのpipだとか)の他にpip3.6とかいうのがある。WinmergeでDiffをとってみたら、全部同じだった。まぎらわしいが、過去のしがらみとかそういうのだろう。それはそれとして、Winmergeの.exe形式インストーラがzip圧縮されて頒布されているというのはどうなんだろうか。

 

しかるにwxPythonはどうなったかというと不成功。今更ながらエラーログの類をよく見てみたら、Windowsのユーザーフォルダの中にキャッシュを作ってあれこれしていたのでまずは下記のようにしてキャッシュを無効化してみた。

% pip --no-cache-dir install -I wxpython

…これでもNG。まあそんなに期待はしていなかったが…。

おそらく「Unable to find vcvarsall.bat」と指摘されているエラーが問題なのだろう。要するにWindows SDKを別途用意する必要があるようだ(関連記事)。

しかしPython3.6.1をビルドしたと思われるVisual C++ 2015のSDK単体をMS公式ですぐ見つけることができなかった。改めてVisual Studioをインストールするのもどうかと思い、いにしえのVisual Studio2005の場所を環境変数で指定して逃げられないか試してみる。つまり「VS140COMNTOOLS」に値「C:\Program Files\Microsoft Visual Studio 8\VC」を与えてみる…結局ダメ。

もう面倒なのでVisual Studio 2017 communityを最小構成で放り込むことにした。待ち時間が暇だったので、バックグラウンドでpip install cx_freezeしておいた。

 

さてwxPythonに戻ると、今度は「msvc9compiler.py」にて「raise ValueError(str(list(result.keys())))」。

 

そろそろ家族の目が冷たくなってきたので今日はここまでとする。

自宅PCに統計解析ソフト「R」を導入

■ 概要

家計を眺めていて、折れ線グラフや円グラフだけでは掴みきれないデータがまだまだ埋もれていそうだったので、流行に乗ってRを使ってみることにした。ひとまず環境立ち上げだけ(日本語の扱いは後で考える)。

■ 入手先

R本体Google chromeでは何故かアクセスできなかったのでIE経由で入手

R Studio:公式を参照するだけ

■ 試用

日々の出金額リストをCSVで用意してRに読み込ませ、箱ひげ図を書かせてみた。

CSV読み込みの時点で当然のように日本語文字列は化けてしまったが、箱ひげ図はboxprot()命令でとりあえず出てきた。

まあ有益な情報を読み取るにはもう少し元データの整理が必要か。まずは週ごとの出金額を箱ひげ図やヒストグラムで見てみたい。

 

■ 参考サイト

奥村晴彦先生による「Rの初歩