Developer's Blog

PyObjC で Python から Cocoa にアクセスしてみよう

iOS/Mac アプリ開発担当の松本です。
全部 Python で書けたら良いのにと妄想しながら、毎日 Objective-C 書いてます。

さて今回は PyObjC を使って Cocoa オブジェクトに Python からアクセスしてみたいと思います。PyObjC は名前の通り Python と Objective-C の双方向ブリッジで、PyObjC を使うと Objective-C で書かれたオブジェクトを Python から使ったり、その逆も可能になります。

PyObjC は Leopard 以降の Mac OS X にインストールされている Python にバンドルされているので、最近の Mac を使っていれば特に別途インストールは必要ありません。また PyObjC のサイトを見ると最新リリースが 2009年11月となっていてメンテナンスされていないような印象を受けますが、リポジトリを見ると、ひっそりとメンテナンスが続けられているようです。

それでは早速試してみましょう。Python インタプリタを起動して以下を入力します。(できれば iPython の方が良いと思います。)

>>> from Foundation import *
>>> text = NSString.stringWithFormat_('hello %s world', 'objc')
>>> text
u'hello objc world'

NSString を Python から利用できました。このように Cocoa なオブジェクト達にインタラクティブな環境からアクセスしてコンパイルなしに実行できるというは、結構便利だと思います。次はもう少し複雑な例を見てみましょう。

以下のコードでは、はてなブックマークのホットエントリのフィードを Cocoa で取得し、取得したデータを Python の feedparser でパースしてタイトルを出力しています。

#!/usr/bin/python
# -*- coding: utf-8 -*-

from Foundation import *

# Cocoa を使って feed を取得
url = NSURL.URLWithString_('http://feeds.feedburner.com/hatena/b/hotentry')
req = NSURLRequest.requestWithURL_(url)
(data, resp, error) = NSURLConnection.sendSynchronousRequest_returningResponse_error_(req, None, None)
content = NSString.alloc().initWithData_encoding_(data, NSUTF8StringEncoding)

# Python ライブラリを使ってfeedを解析
import feedparser
feed = feedparser.parse(content.encode('utf-8'))
for entry in feed['entries']:
  print entry['title'].encode('utf-8')

やや無理矢理ではありますが、Cocoa と Python を連携させて一つの処理を行わせています。Cocoa も Python もそれぞれ得手不得手があるので上手く組み合わせて、面白いものを作っていきたいですね。

個人的に Mac アプリのテストコードは Python で書けるんじゃないかと目論んでいます。例えば Cocoa の CoreData で作成したデータに Python からアクセスできると、凄くテストがしやすくなります。 また PyObjC は nib をロードする事もできるので、ある程度は GUI のテストも出来そうですね。

Python 好きな Mac 開発者の夢が広がる PyObjC、実用的な使い方ができるようになったら、またご紹介させていただきたく思います。

それでは皆様、良い夏休みを!

Copyright © 2019 Fenrir Inc. All rights reserved.