2010-12-27 19 views
7

私はこれをprogrammers.stackexchange.comに掲載しましたが、私はそれがより適切かもしれないと考えました。Emacs:Pythonをデバッグするためのメソッド

すべてのコード編集にemacsを使用しています。通常、Mxコンパイルを使用してテストランナーを実行しますが、これはコードをトラックに保存するために必要なものの約70%を取得しますが、最近はMx pdbをどのように使用することが可能か疑問に思っていますブレークポイントを叩いて物を点検してみるのもいいでしょう。

私のグーグルでは、これが役に立つ/可能であることを示唆するsome thingsが見つかりました。しかし、私はそれを私が完全に理解する方法で働かせることはできませんでした。

私は、それがより困難にされる可能性があります増築+のAppEngineの組み合わせだ場合は知っているけど、私は

M-x pdb 
Run pdb (like this): /Users/twillis/projects/hydrant/bin/python /Users/twillis/bin/pdb /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 

.../binに/ pythonのような何かをしようとすると、インタプリタではありませんビルドアウトは、すべての卵に設定されたパスで行います。

〜/ binに/ PDB

HellooKitty:hydrant twillis$ cat ~/bin/pdb 
#! /usr/bin/env python 

if __name__ == "__main__": 
    import sys 
    sys.version_info 
    import pdb 
    pdb.main() 
HellooKitty:hydrant twillis$ 

.../binに/ devappserver現在のPythonインタプリタを使用してpdb.mainに呼び出すための簡単なスクリプトは、ビルドアウトレシピはGAEのプロジェクトのために作ることdev_appserverスクリプトですapp.yamlを

へのパスで、... /部品/消火栓-アプリは、私が最初に何が

過ぎず起こりません

Current directory is /Users/twillis/bin/ 
C-c C-f 

プロンプトを提示しています
HellooKitty:hydrant twillis$ ps aux | grep pdb 
twillis 469 100.0 1.6 168488 67188 s002 Rs+ 1:03PM 0:52.19 /usr/local/bin/python2.5 /Users/twillis/projects/hydrant/bin/python /Users/twillis/bin/pdb /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 
twillis 477 0.0 0.0 2435120 420 s000 R+ 1:05PM 0:00.00 grep pdb 
HellooKitty:hydrant twillis$ 

何かは、ブレークポイントが設定されていることを報告します

C-x [space] 

が起きています。しかし、私は物事を進ませることができません。

私はここで明らかに何かが不足しているように感じます。私ですか?

emacsでインタラクティブなデバッグをする価値がありますか?インタラクティブなGoogle App Engineアプリのデバッグが可能ですか?どのように私はこれを動作させるかもしれないかに関する任意の提案?

+0

ここをご覧ください:http://jjinux.blogspot.com/2008/05/python-debugging-google-app-engine-apps.html – systempuntoout

+0

ここ、http://code.google.com/p/googleappengine/issues/detail?id = 308 – systempuntoout

答えて

4

GAEの特定の問題は、STDOUTをデバッガの出力を含めてブラウザにリダイレクトすることです。

pdb documentationに概説されているように、通常のワークフローでは、必要な時点でコードにブレークポイントを設定します。通常はimport pdb; pdb.set_trace()となりますが、GAEの場合は、STDINとSTDOUTも取得する必要があります。たとえば、このコードスニペット:

def set_trace(): 
    import pdb, sys 
    debugger = pdb.Pdb(stdin=sys.__stdin__, 
     stdout=sys.__stdout__) 
    debugger.set_trace(sys._getframe().f_back) 

は、その後のemacsでシェルを起動し、そこからあなたのコードを実行します。

$ ./bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 

emacsのシェル・インタラクション・バッファ内の適切な場所に簡単にアクセスするために、

最後に、pdbtrack機能が含まれているような、最近のバージョンのpythonがあることを確認してください(ほぼ確実にしかし、あなたは間違いなくそれを望んでいます、それはst epからemacsのコードまで)。

+0

ahこれは実際に解決策になるかもしれません。私はそれを少し演奏しなければならないが、あなたが言うようにdevappserverがstdin/outをつかむことは、pdbが私のためにemacsにちょうどぶら下がっている理由かもしれない。 pdbtrackの提案もありがとう、私はそれを知らなかった。 –

+0

まだ完全には動作していませんが、これは間違いなくパズルの一部です。 –

1

あなたのコードでpdb.set_trace()を試してみて、ドライバスクリプトを使うのではなく、あなたのプログラムを普通に呼び出すだけです(私はちょうど/Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/があなたのケースでうまくいくと思います)。pdbを呼んだところでデバッガに落とすべきです。 set_trace()を実行してから、必要に応じてブレークポイントを追加することができます。

関連する問題