IPythonを使ってZope3デバッグ :: 幕の内 - CMS - コンテンツマネジメントシステム

IPythonを使ってZope3デバッグ

IPythonモジュールを用いたZopeのデバッグ効率化について。対話コンソールが機能拡張されます。また、Windows環境でもタブ補完が出来るようになります。

今日は8月15日。世間一般ではお盆休みの最終日と言うことになっていますが、弊社は ふつ~ に稼働しています。IT業界がお盆休まないのは海外との関連なんでしょうかね?

IPythonをZopeのデバッグコンソールで使用してみたところ、デバッグ作業がかなり効率よく行えるようになりました。IPythonが提供する対話コンソールの機能拡張はたくさんありますが、筆者が一番うれしいのはWindows環境でのタブ補完機能だったりします。

インストール

FrontPage - IPython が公式サイトです。ダウンロードページに各プラットフォームでのインストール方法が書いてありますが、ここではWindowsで動作させるまでについて記載します。

ダウンロードページ上部の downloads リンクに進み、 ipython-0.8.1.win32.exepyreadline-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を操作したり、対話モードで実験コードを書いて試したり、いろいろなことが出来て便利です。ためしにやってみたのが以下の操作です。

>>> root
<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行を入力します。

>>> import IPython
>>> IPython.Shell.IPShell(user_ns=locals()).mainloop(sys_exit=1)

実はやりかたは Zope 2 wiki DebuggingWithIPythonAndOtherTips というページに書いてありました。なので、この方法はZope2でも同じように使えます。 それでは、IPythonのコンソールで色々やってみましょう。

In [1]: root
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様のお告げでは)見あたらなかったので、環境固有の問題の可能性もありますが、せっかくなので載せておきます。

日本語全文検索KabayakiBOX 日本語全文検索KABAYAKI コミュニケーションポータル オープンソースウェブ ウェブフレームワークKahua オンライン出版サイトKarretta
本サイト上で記載されている製品名および商品名は、それぞれの会社の商標または登録商標です。
幕の内 (R) は Time Intermedia Corporation の登録商標です。
IPythonを使ってZope3デバッグ :: 幕の内 - CMS - コンテンツマネジメントシステム