今日は8月15日。世間一般ではお盆休みの最終日と言うことになっていますが、弊社は ふつ~ に稼働しています。IT業界がお盆休まないのは海外との関連なんでしょうかね?
IPythonをZopeのデバッグコンソールで使用してみたところ、デバッグ作業がかなり効率よく行えるようになりました。IPythonが提供する対話コンソールの機能拡張はたくさんありますが、筆者が一番うれしいのはWindows環境でのタブ補完機能だったりします。
インストール
FrontPage - IPython が公式サイトです。ダウンロードページに各プラットフォームでのインストール方法が書いてありますが、ここではWindowsで動作させるまでについて記載します。
ダウンロードページ上部の downloads リンクに進み、 ipython-0.8.1.win32.exe と pyreadline-1.4.4.win32.exe をダウンロードして実行します(Python-2.4.4がインストール済みとします)。また、pyreadlineをWindows環境で使うためにはctypesが必要なので、 SourceForge.net: ctypes から ctypes-1.0.2.win32-py2.4.exe あたりを取得してこれもインストールします。
インストールが完了したら、スタートメニューから プログラム -> IPython -> IPython を実行します。すると以下のようなコンソールが表示されます。
********************************************************************** Welcome to IPython. I will try to create a personal configuration directory where you can customize many aspects of IPython's functionality in: C:\Documents and Settings\shimita\_ipython 中略 Please press <RETURN> to start IPython.
上記に表示されているフォルダ(C:Documents and Settingsshimita_ipython)に設定カスタマイズ用のファイルがあるようです。とりあえずはデフォルトのまま使うので、今回は何も変更しませんが、色の変更や表示の変更などが行えるようです。 ここでRETURNキーを押すと、早速使えるようになります。
Zopeのデバッグコンソールで使う
Zope2の場合は bin/zopectl debug, Zope3の場合は bin/debugzope コマンドでデバッグコンソールを起動することが出来ます。デバッグコンソールではZODBを操作したり、対話モードで実験コードを書いて試したり、いろいろなことが出来て便利です。ためしにやってみたのが以下の操作です。
<zope.app.folder.folder.Folder object at 0x0220F2B0>
>>> dir(root)
['__annotations__', '__class__', '__contains__', '__delattr__', '__delitem__', '
__dict__', '__doc__', '__getattribute__', '__getitem__', '__getstate__', '__hash
__', '__implemented__', '__init__', '__iter__', '__len__', '__module__', '__name
__', '__new__', '__parent__', '__providedBy__', '__provides__', '__reduce__', '_
_reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__setstate__', '__str_
_', '__weakref__', '_p_activate', '_p_changed', '_p_deactivate', '_p_delattr', '
_p_getattr', '_p_invalidate', '_p_jar', '_p_mtime', '_p_oid', '_p_serial', '_p_s
etattr', '_p_state', '_sm', 'data', 'get', 'getSiteManager', 'items', 'keys', 's
etSiteManager', 'values']
>>> root.keys()
<OOBTreeItems object at 0x01995F70>
>>> list(root.keys())
[u'Portal', u'Portal-2', u'mysite']
>>> root['mysite']
<zope.app.folder.folder.Folder object at 0x0220F430>
>>>
ここで、さらに便利にするためにIPythonを使えるようにするために以下の2行を入力します。
>>> IPython.Shell.IPShell(user_ns=locals()).mainloop(sys_exit=1)
実はやりかたは Zope 2 wiki DebuggingWithIPythonAndOtherTips というページに書いてありました。なので、この方法はZope2でも同じように使えます。 それでは、IPythonのコンソールで色々やってみましょう。
Out[1]: <zope.app.folder.folder.Folder object at 0x0220F2B0>
In [2]: dir(root)
Out[2]:
['__annotations__',
'__class__',
'__contains__',
'__delattr__',
'__delitem__',
'__dict__',
*snip*
'data',
'get',
'getSiteManager',
'items',
'keys',
'setSiteManager',
'values']
In [3]: root.keys()
Out[3]: <OOBTreeItems object at 0x02146F48>
In [4]: list(root.keys())
Out[4]: [u'Portal', u'Portal-2', u'mysite']
In [5]: root['mysite']
Out[5]: <zope.app.folder.folder.Folder object at 0x0220F430>
In [6]: root.__p <TAB>
root.__parent__ root.__providedBy__ root.__provides__
In [7]: root?
Type: Folder
Base Class: <class 'zope.app.folder.folder.Folder'>
String Form: <zope.app.folder.folder.Folder object at 0x0220F2B0>
Namespace: Interactive
Length: 3
Docstring:
The standard Zope Folder implementation.
In [8]: _3
Out[8]: <OOBTreeItems object at 0x02146F48>
[2]は出力がpprintで表示されています。[6]はタブ補完です。[7]は変数の詳細情報を表示してくれています。変数名の後ろに ?``を付ける代わりに ``?? を付けるとソースコードも表示してくれます。[8]は前の処理の出力を再利用する例です。他にもいろいろな機能があるので、ヘルプ( ? とだけ入力すると表示されます)を見て試してみてください。
Windows環境でのCtrl+H
ところで、自分はWindows環境下で使っているのですが、XP Professional SP1 + Python2.3 or 2.4 では Ctrl+H でコンソールが乱れてしまう問題に遭遇してしまいました。Backspaceキーはちゃんと効くのですが、 Ctrl+H を入力すると ^H というコントロールコードが表示されてしまうようです。そこでpyreadlineに以下のようにパッチを当ててとりあえず動くようにしてみました。
--- pyreadline/keysyms/keysyms.py.orig
+++ pyreadline/keysyms/keysyms.py
@@ -119,6 +119,10 @@
char = chr(VkKeyScan(ord(char)) & 0xff)
elif control:
char=chr(keycode)
+ if control and ord(char)==8 and keycode==72:
+ keycode=8
+ control=False
+ state &= 0xfffffff7
try:
keyname=code2sym_map[keycode]
except KeyError:
ぱっと見た感じ、同様の問題に遭遇している人は(Google様のお告げでは)見あたらなかったので、環境固有の問題の可能性もありますが、せっかくなので載せておきます。