IntelliJ idea 11でpythonのリモートデバッグ

Intellij Ideaではpythonのリモートデバッグができるということで試してみました。

Python Pluginを入れる

Preferences(⌘,)からPluginsを選び、「Browse repositories...」ボタンを押します。

Python」で検索すれば見つかりますのでOKでインストールします


テスト対象を用意

kay frameworkを使ったブログエンジンの「theokayblog」を動かしてみます。

http://code.google.com/p/theokayblog/

VCS -> Checkout From Version Control -> MercurialでダイアログにRepository URLを入力します

リポジトリURL
https://code.google.com/p/theokayblog/

cloneが完了したらNew Projectのダイアログが出ますので 「Create project from existing sources」を選択した状態でNextボタンを押します。

次々にダイアログがでますが、特に設定を変えずに最後のFinishボタンまで押しました。

これでプロジェクトが作成されます。

プロジェクト内のkayディレクトリとmanage.pyはシンボリックリンクになってますので、設定しなおします。

$ cd ~/tmp/theokayblog
$ rm kay
$ rm manage.py
$ ln -s /usr/local/kay/kay kay
$ ln -s /usr/local/kay/manage.py manage.py

起動設定をする

Run -> Edit Configrations で表示されるダイアログの左上の+アイコンを押し、python remote debugを選択します。

Nameに名前を入力し、Portに適当なポート番号を入力してOKを押します。
ここではNameに「pythonremotedebug」Portに54321と入れてみました


pycharm-debug.eggをコピーする

Pythonプラグインに含まれているpycharm-debug.eggをPYTHONPATHに通す必要があります。
ファイルは~/Library/Application Support/IntelliJIdea11/python/にありました。

とりあえず、プロジェクトのlib以下にコピーしましたが、本当はもっと適した場所があるのかもしれません。

$ cp ~/Library/Application\ Support/IntelliJIdea11/python/pycharm-debug.egg ~/tmp/theokayblog/lib/

manage.pyを修正

アプリを起動する際にpydevd.settraceを呼び出す必要があります。
とりあえず、if __name__ == '__main__':の上に以下を追記してみました。本当はもっとよいやりかたがあるのかもしれません。

settraceに渡しているportは先ほどEdit Configurationsで入力したものと同じです。

sys.path.append('lib/pycharm-debug.egg')

from pydev import pydevd
pydevd.settrace('localhost', port=54321, stdoutToServer=True, stderrToServer=True)

intellij側で起動

Run -> Debugで先ほど設定した「pythonremotedebug」を選択します。

このようなウィンドウがでて、接続待ちになったことがわかります

以下のようなエラーになる場合は、その後に表示されるダイアログでSDKを設定します。


アプリを起動

コンソールからプロジェクトのディレクトリで以下を実行します。

$ python manage.py runserver

アプリが起動したら、適当な箇所にブレイクポイントを設定して、ブラウザからアクセスすると、そこで処理がとまります。

F8でステップ実行することができます。

主なキー操作は以下の通り

キー 処理
F9 Resume Program
F8 Step Over
F7 Step Into
⌥⇧F7 Forse Step Into
⇧F8 Step Out
⌃F2 Stop
⌃⇧F8 View Break Point

感想

ちゃんと動きました。とりあえずできたってだけなので、これからちゃんとお仕事で使ってみようと思います。

pdb.set_trace()でもステップ実行できるんですが、eclipseみたいなデバッグに慣れている人なんかはこっちのほうが取っ付きやすいかもしれません。