2009-05-29 4 views
11

ねえ、私が思っていた...私は日食とPyDevはを使用していると私は本当に強力なデバッグ機能を楽しんでいますが、私は思っていた:Pythonインタラクティブセッション中のプログラムにジャンプしますか?

ことは可能であるEclipseでブレークポイントを設定し、にジャンプします実行中のインタラクティブなPythonインタプリタ?

私はそれはかなり便利だと思う;)

編集:私は私の目標は、デバッガにジャンプすることはないことを強調したいです。 pydev/eclipseには素晴らしいデバッガがあり、トレースバックを見てブレークポイントを設定できます。私が欲しいもの

は私が...

  • のようなものは、物事
  • の値が操作周り
  • チェックを突く行うことができますので、スクリプトを実行し、実行時に対話的なPythonインタプリタにジャンプすることです変数
  • フィギュアうちいくつかのコードを、私はアプリ

に追加する前に、私はあなたがこのすべてのウィットを行うことができます知っています私は何かを試すことができます、それが動作しないことを確認し、もう一度そのコードを実行するポイントにアプリを取得せずに何かを試すことができますので、私はインタラクティブなインタプリタで速く行うことができます。

+0

強調する必要はありません。再フォーマットすることを検討してください。 –

答えて

8

年を上からOPの質問によると、PyDevにはこの機能が組み込まれています。この機能が導入された時期はわかりませんが、私が知っているのは最後の〜2時間のグーグルを過ごしたことです... iPythonを構成していますジョブ)、しかしEclipse/PyDevを実現するためだけに私はootbをしたい。

デバッグモードでブレークポイントをヒットするとすぐに、コンソールは準備ができて待機しています。 プロンプトまたは点滅カーソルがないので、私はこれに気付かなかった。私は間違ってそれが標準の出力専用のコンソールであると仮定していましたが、そうではありません。それはコード補完さえしています。

詳細については、http://pydev.org/manual_adv_debug_console.htmlをご覧ください。

+0

wow ... great find :) – Jiaaro

+0

はい、あなたはApache + mod_wsgiスタック(または他のプロダクション設定)でも使用できます。しかし、対話型コンソールが確実に動作するようにするには、次のように起動する必要があります: 'pydevsrc import pydevd; pydevd.settrace( ''、stdoutToServer = True、stderrToServer = True)' –

-2

既にデバッグモードで実行している場合は、プログラムの実行が現在一時停止している場合(ブレークポイントが既にあるなど)、追加のブレークポイントを設定できます。私はちょうど最新のPydevで試してみました。

通常(つまりデバッグモードではない)で実行している場合、すべてのブレークポイントは無視されます。ブレークポイントを変更しても、非デバッグ実行の仕方は変わりません。

2

私はsitecustomize.pyでこのコードを使用して、例外でデバッガを開始しています。これは、Ctrl + Cキーでもトリガーできます。それはシェルで美しく動作し、日食について知りません。

import sys 

def info(exception_type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or not sys.stdin.isatty() or not sys.stdout.isatty() or type==SyntaxError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(exception_type, value, tb) 
    else: 
     import traceback 
     import pdb 


     if exception_type != KeyboardInterrupt: 
      try: 
       import growlnotify 
       growlnotify.growlNotify("Script crashed", sticky = False) 
      except ImportError: 
       pass 

     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(exception_type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

はここsourcemore discussion on StackOverflowです。

2

code.InteractiveConsoleを使用して対話セッションにジャンプすることができます(here)。しかし私はEclipseからこれを引き起こす方法を知らない。

解決策は、この対話型コンソール(signalモジュール:signal.signal(signal.SIGINT, my_handler)を使用)にジャンプするためにCtrl + Cを傍受することですが、おそらく実行コンテキストが変わる可能性があります。

1

本当にあなたの質問への答えではなく、iPythonへのポインタです。あなたがそれを意識していない場合に備えて。私はそれをちょうどそのようなもののためにeclipse/pydevと一緒に使用します。

関連性のあるものはiPythonをあなた自身のアプリに埋め込むことに関するこの情報です。 eclipse/pydevの外でそれをやりたいなら、これはあなたが探していることをする能力を提供します。

6

これは古いプロジェクトのものですが、書きませんでしたが、ipythonを使いたいものと似ています。ジム・ロバート(質問の所有者)によって

'''Start an IPython shell (for debugging) with current environment.      
Runs Call db() to start a shell, e.g.             


def foo(bar):                   
    for x in bar:                  
     if baz(x):                  
      import ipydb; ipydb.db() # <-- start IPython here, with current value of x (ipydb is the name of this module). 
.                      
''' 
import inspect,IPython 

def db(): 
    '''Start IPython shell with callers environment.''' 
    # find callers                  
    __up_frame = inspect.currentframe().f_back 
    eval('IPython.Shell.IPShellEmbed([])()', # Empty list arg is      
     # ipythons argv later args to dict take precedence, so       
     # f_globals() shadows globals(). Need globals() for IPython     
     # module.                  
     dict(globals().items() + __up_frame.f_globals.items()), 
     __up_frame.f_locals) 

編集:あなたはこの例のためmy_debug.pyというファイルに上記のコードを配置した場合。次に、あなたのpythonのパスにそのファイルを配置し、(あなたがシェルから実行している限り)デバッガーにジャンプするには、あなたのコード内の任意の場所に次の行を挿入することができますので、おおよそ

import my_debug 
my_debug.db() 
関連する問題