[Windows Mobile]PythonCEをAdvanced/W-ZERO3 [es]で使ってみた
ここのところ、Advanced/W-ZERO3 [es]でのセルフプログラミング用言語の探索をしてます。
ZaurusではRubyを使っていますが、ruby-mswinceはsocket(ネットワーク系機能)が使えないのが残念だったので、別のプログラミング言語を調べ、PythonCEに行き着きました。
これが予想外にとても使えるものだったのでホクホク。
Advanced/W-ZERO3 [es]でも問題無く使えているよう。
インストールはcab一発。
今なら、「PythonCE-25-20061219.PPC2003_ARM.CAB」というファイルをインストールすればOK。
PythonCEを一度起動すると、拡張子pyへの関連付けがなされるようです。
Pythonスクリプトを拡張子pyのファイルとしてエディタで作れば、Explorer等から実行可能です。
PythonCEは独自にコンソールを実装しているので、cmd.exeを使う場合に問題になる、エラーメッセージが読めないというトラブル、標準出力に表示しなくなってしまうトラブルと無縁。
Python2.5がベースになっていてcodecsが標準で添付されており、日本語への対応OK。
内部処理はasciiかunicodeですが、shift_jisやeuc-jpなどの読み書きが可能。socketも動作を確認。
EmacsCEにpython-mode
Pythonのソースを書くには、python-modeを使うと便利。これをEmacsCEで動かします。
解凍して出てきた*.elをsite-lispにコピー。
EmacsCEには(というか、Emacs20.7には)python-modeに必要なansi-color.elが入っていないので、www.emacswiki.orgからもらってきて、site-lispに入れたらすんなり動きました。
ただ、EmacsCEではMule-UCSが動かないので、utf-8でソースを書けないのが困りもの。
普通は母艦でスクリプトを書いて、それを持ってくる方がいいと思いますが、Mac OS X Tiger標準のPythonはcodecsにshift_jis、euc_jpが入ってなかったりしたので2.5を入れて環境を合わせました。
マニュアルを用意
PyJUGに日本語マニュアルあり。
html版のアーカイブをダウンロードし、microSDに入れておき、ブックマーク。
動作確認スクリプト:Webページを取ってきてテキストファイルとして保存
import httplib, codecs, re
conn = httplib.HTTPConnection('www.google.co.jp', 80)
conn.request("GET", "/index.html")
res = conn.getresponse()
conn.close
body = res.read().decode('shift_jis')
body = re.sub("<.+?>", "", body, 0)
body = re.sub(" ", " ", body, 0)
body = re.sub("©", "(c)", body, 0)
fout = codecs.open('/google.txt', 'w', 'shift_jis')
fout.write(body)
fout.close
動作確認スクリプト:Webページの一部を抜き出す
Rubyで言うところのopen-uriのようなurllibを使えば、より簡単にページを取得できます。
スクレイピングをするBeautifulSoupというライブラリがあり(sh1.2さんの紹介記事)これも動作しました。
こういう非標準ライブラリは、Libディレクトリに入れておくと使えるようになります。
最初に使われるときに、バイトコンパイルされるようですね。
ページ中のリンクを集めてファイルに書き出す処理です。
import urllib from BeautifulSoup import BeautifulSoupURL='http://www.google.co.jp/'
b = BeautifulSoup(urllib.urlopen(URL))urls = []
for i in b.findAll('a'):
try:
if i.attrs[0][0] == 'href':
urls.append(i.attrs[0][1])
except IndexError:
continuefout = open('/urls.txt', 'w')
for u in urls:
fout.write(u + "\n")
fout.close
動作確認スクリプト:メールを送る
SMTP認証あり、Message Submissionの例。
日本語のメールを送ることも可能と思われます。
PythonCEには、Pythonの一般事例がそのまま適用できるようなので、情報には事欠かないでしょう。
import smtplib
server = smtplib.SMTP('SERVER_ADDRESS', 587)
fromaddr = 'FROM@ADDRESS'
toaddr = 'TO@ADDRESS'
msg = 'PythonCE test'
server.login('USER_NAME', 'PASSWORD')
server.sendmail(fromaddr, toaddr, msg)
server.quit()
総評
立派なオブジェクト指向言語。ネットワークへの対応もバッチリ、日本語の読み書きもOKということで、かなり実用的と感じました。国内でももっと使われていいんじゃないでしょうか。
今回インストールしたPythonCEにはsqlite3.dllが添付されていて、sqlite3をimportできたので標準で使えるようです。かなり便利そう。
MortScriptやnScript/nScriptmと比較した場合、Windows Mobileにフォーカスした関数が乏しいのがウィークポイントですが、それを補ってあまりある基本機能とドキュメント、ライブラリ、情報があるので、必ずやAdvanced/W-ZERO3 [es]の力になってくれるはず。
足りないところはMortScriptと組み合わせて補うと、案配がいいんではないかと。
Win32apiのwrapperをPure Pythonで書けるようです。PythonCEにはwin32clipboardが無いんですが、クリップボードへのアクセスも拡張できるんですかね。
« [Windows Mobile]ruby-mswinceをAdvanced/W-ZERO3 [es]で使ってみた | Main | [Window Mobile]WX310K(京ぽん2)からAdvanced/W-ZERO3 [es]にアドレスとブックマークを転送 »


Comments
はじめまして,はりゃといいます。
いつもここを見てます。
自分もSIM無しw-zero3でpythonCEを遊んでいます。
ご存知かもしれませんが,
pythonCE用のGUIとしてVensterCEがあります。
http://sourceforge.net/projects/vensterce
付属のチュートリアルでは動くのと動かないのが
ありますが、そこそこ使えます。
またpythonCEは標準で外部アプリの起動ができません。
よってモジュールctypesを使ってwin32apiを呼んであげます。
VensterCEも同じくctypesを使ってます。
以下はoperaに引数のURLを渡して実行するサンプルです。
from ctypes import *
shell = windll.coreDll.CreateProcessW
cmd = u"\\Program Files\\Opera\\opera.exe"
para = u"http://www.yahoo.co.jp"
shell(cmd, para, None, None,0,0,None,None,None,None)
あとBeautifulSoup以外にも
強引にインストールすれば(setup.pyができない…)
mechanizeもimportはできます。
でもまだきちんと動作させてません。
痛いバグ(仕様?)としてはpythonCE本体が
起動しているとスクリプトの実行ができない
(フォーカスが変わるだけ),
また(自分の環境では)無線LANに接続状態で
pythonCEを起動するとなぜか切断処理して
再接続を行うため,再接続中にスクリプトが
ネットにアクセスすると例外を投げます,
まあ我慢できますが。
引数の内容に日付を追加して特定のファイルに
保存するメモ帳なスクリプトや,
引数の内容をURLエンコードしてwikipediaのアドレスに変換,
operaに渡すとかできそうです。
スクリプト実行専用のランチャーがほしい今日この頃です。
長文失礼しました。
Posted by: はりゃ | 2007.07.30 at 09:34 PM
コメントありがとうございます。PythonCEいいですよね。
GUIは知ってました。昨日PythonCEのフォーラムの、
http://www.nabble.com/GUI-package-for-PythonCE-t3286969.html
このスレッドをちょっと読んでいたもので。
VensterCEはAPIを直で扱うので煩雑。
wxPythonがクロスプラットフォームでよさそうなんじゃないかと思ってます。
Mac OS X Tigerに標準搭載ですし……。
ひょっとしたらwxPyCEは日本語は通らないんですかね。
ctypeの件参考になります。
標準では外部コマンドが実行できないとは知りませんでした。
できるものと思っていたので助かります。
OpenClipbordとかもきっとラッパー書けるんでしょうね。
Win32api、僕にはさっぱりですが。
mechanizeはいいですね! 早速使ってみたいと思います。
これもこないだRuby版のことを読んで、便利そうだと思ってました。
http://yoosee.net/d/archives/2005/09/02/002.html
また、PythonCEの仕様についてもありがとうございます。
僕のところでは無線LANは大丈夫ですね。
特に切断されることはありません。
PythonCE実行中にスクリプトが実行できないのはしょうがなさそうですね。
PythonCE、僕も何に使ってやろうか考え中です。
月並みながら、まずはrlTodayがらみかなあと。
あとは、GSFinderの「送る」関係でftpサーバにアップ、XML-RPCでブログに画像をアップとか。画像関係もいいなとEXIF.pyを試したんですが、画像を開いてインスタンスが返ってくるべきところ、Nullでした。
画像のリサイズとかできないかな、などと考えてます。
スクリプトランチャーは僕も欲しいです。
PythonCEが起動中だったら終了させてからー、とかですかね。
Posted by: moyashi | 2007.07.31 at 04:52 AM
PythonCEはデフォルトでは一度に一つのインスタンスしか起動できませんが、「/new」オプション付きだと複数のインスタンスを起動できるようです。
>By default, PythonCE only allows one instance to be running at a time. This option allow you to start a multiple instances.
ついでに書いておきますが、
PythonCEを「/nopcceshell」オプション付きで起動すると、シェルが表示されません。
>Starts PythonCE without the graphical shell. This is only useful when also passing a script filename on the command line.
Posted by: moyashi | 2007.08.01 at 03:59 PM
はじめまして、みとと申します。
上記にあるwxPython( http://wxpyce.wikispaces.com/ より入手)を入れてみたのですが、どうも上手く動きません。
import wx すると、何故か\CF Card\Python~以下のライブラリを読みに行ってしまい DLL load failed となってしまいます。
\CF Card\Python~以下にPythonCEを置いてみたのですが、やはり上手くいかないようです。
とはいえこの環境を手放すのは惜しいので、もう少し調べてみたいと思います。(Python初心者ゆえどこまでできるか分かりませんが)
素晴らしい記事をありがとうございます。
Posted by: みと | 2007.08.01 at 09:22 PM
はじめまして。
僕は今、pyexceleratorというExcelファイルを生成するやつを試しているのですが、Libディレクトリにpyexceleratorのフォルダを入れてもimportできないですね。
http://sourceforge.net/projects/pyexcelerator
これ系の、ディレクトリの中に__init__.pyがあって……、というタイプのライブラリはimportに失敗しそう。
wxPythonの前にpyexceleratorを片付けないと先に進めません。
手探り中です……。力になれなくてすいません。
http://www.nabble.com/Can%27t-Get-My-Import-Module-Command-to-Work-Properly-tf1631521.html#a4422583
この辺かなあと思って試すも、ダメですね。
--------------追記-----------------
EXIF.pyは動きました。GR Digitalで撮影した画像からEXIF読み出しできました。画像がデカいから、ちょっと時間かかりますが。
http://home.cfl.rr.com/genecash/digital_camera/EXIF.py
デフォルトの拡張子の関連付けに修正が必要なことを発見。
pywという拡張子にすると、「/nopcceshell」オプション付きで実行され、シェルが表示されないはずなんですが、「\nopcceshell」という具合にスラッシュがバックスラッシュになってます。これをスラッシュに直すと大丈夫。
Posted by: moyashi | 2007.08.02 at 03:06 AM