ひよっこ。

I want to…

IPythonの拡張機能を作成する

Posted by hikaruworld : 2012 1月 5

bazaarのプラグインを書こうとしてIPythonを起動したら、
何故かIPythonのエクステンションの書き方を調べてしまったのでログとして残しておきます。

IPythonのextensionの書き方は公式サイトIPython extensionsが参考になります。
サンプルとなるエクステンションは、IPython/extensions以下を見るとよいかと思います。

IPythonでextensionを読み込ませるためには2つの手順が必要になります。

1. IPythonのロード設定

IPython起動時に指定したエクステンションをロードするようにProfileに設定を行います。
前回Profileについては簡単に触れていますが、
エクステンションをロードするときは以下のように設定します。

# A list of dotted module names of IPython extensions to load.
c.InteractiveShellApp.extensions = [
    'hello'
]

2.エクステンションの配備

上記のようにロード設定をした後には、
当然エクステンションを配備してあげる必要があります。
IPythonのエクステンションは

os.path.join(self.ipython_dir, 'extensions')

が認識されます。

つまり、ipython起動時に--ipython-dirを指定していない場合、
デフォルトでは$HOME/.config/ipythonが適用されますので、$HOME/.config/ipython/extensionsを作成すればよい事になります。
今回の例ではhelloというエクステンションを読み込んでいるので、ディレクトリ構成は以下のようになります。

$HOME/.config/ipython
└── extensions
    └── hello.py

※関連部分のみ抜粋

3.エクステンションの書き方

IPython起動時の処理

IPythonが起動/終了した場合に何か処理を行いたい場合、以下の関数を定義する事で自動で読み込まれます。

# 起動時の処理
def load_ipython_extension(ipython):
	pass

# 終了時の処理
def unload_ipython_extension(ipython):
	pass

引数で渡されるipythonはTerminalInteractiveShellやInteractiveShellAppなどのインスタンスになります。

マジックコマンドの設定

IPythonはマジックコマンドが定義されていて、色々便利ですよね。
マジックコマンドって何って人は%入力して<TAB>で一覧が確認出来ます。使い方は%XXX?で確認可能です。

In [3]: %
%alias                   %logstart                %pylab
%autocall                %logstate                %quickref
# いっぱいあるので以下省略。

In [3]: %pwd?
Type:       Magic function
Base Class: <type 'instancemethod'>
String Form:<bound method TerminalInteractiveShell.magic_pwd of <IPython.frontend.terminal.interactiveshell.TerminalInteractiveShell object at 0x1017a5ed0>>
Namespace:  IPython internal
File:       ~/.virtualenvs/bazaar/lib/python2.7/site-packages/IPython/core/magic.py
Definition: %pwd(self, parameter_s='')
Docstring:
Return the current working directory path.

Examples
--------
::

  In [9]: pwd
  Out[9]: '/home/tsuser/sprint/ipython'

で、本題。
エクステンションでも独自のマジックコマンドを定義する事が出来ます。
マジックコマンドを定義したい場合、

define_magic(magicname, func)

で登録する事が可能です。

たとえばsayというマジックコマンドを登録したい場合、この様に読み込ませます。

def say_impl(self, parameter_s=''):
	# sayコマンドの実体。引数はparameter_sに設定される。
    print 'Hello %s' % parameter_s

def load_ipython_extension(ipython):
	# ipythonが起動したタイミングで'say'というコマンドを定義する
	ipython.define_magic('say', say_impl)

これをipythonで起動して、実行するとこんな感じで表示されます。

In [1]: %say taro
Hello taro

マクロなどを定義したい場合はdefine_macro(name, themacro)という関数が準備されています。
自分は必要なかったので確認していませんが…。

以上です。
簡単ですね。日本語情報がないことをのぞけば….

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。