13

ちょっと疑問に思っていました...私はEclipseでpydevを使用しており、強力なデバッグ機能を本当に楽しんでいますが、疑問に思っていました:

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

私はそれがかなり便利だと思います;)

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

私が望むのは、スクリプトを実行し、実行中にインタラクティブな Python インタープリターにジャンプして、次のようなことができるようにすることです...

  • 周りをウロウロします
  • 物の価値を調べる
  • 変数を操作する
  • アプリに追加する前にいくつかのコードを見つけます

デバッガーを使用してこれらすべてを実行できることはわかっていますが、インタラクティブ インタープリターを使用すると、アプリを実行ポイントに戻さずに何かを試して、それが機能しないことを確認し、別のことを試すことができるため、より高速に実行できます。そのコードをもう一度。

4

5 に答える 5

9

OPの質問から約1年後、PyDevにはこの機能が組み込まれています。この機能がいつ導入されたのかはわかりませんが、私が知っているのは、最後の〜2時間グーグルを費やしたことだけです... iPythonなどを構成します(これはそれが仕事をしたように見えました)、しかし、Eclipse/PyDev が私が望むものを持っていることに気付くだけです。

デバッグ モードでブレークポイントに到達するとすぐに、コンソールの準備が整い、待機状態になります。プロンプトや点滅カーソルがないため、これに気づきませんでした。私はそれが標準の出力専用のコンソールであると誤って想定していましたが、そうではありません。コード補完もあります。

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

于 2010-09-06T10:28:37.933 に答える
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)

Jim Robert (質問所有者) による編集: 上記のコードを、my_debug.pyこの例のために呼び出されたファイルに配置した場合。次に、そのファイルを Python パスに配置します。次の行をコードの任意の場所に挿入して、デバッガーにジャンプできます (シェルから実行する場合)。

import my_debug
my_debug.db()
于 2009-06-07T15:41:31.523 に答える
3

私は長い間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

StackOverflow に関するソースとその他の議論を次に示します。

于 2009-05-29T14:52:58.723 に答える
2

here でcode.InteractiveConsole説明されているように使用して、対話型セッションにジャンプできます。ただし、これを Eclipse からトリガーする方法がわかりません。

解決策は、Ctrl+C をインターセプトしてこのインタラクティブ コンソールにジャンプすることかもしれません (シグナルモジュール:を使用signal.signal(signal.SIGINT, my_handler))。

于 2009-06-05T15:20:58.470 に答える
-2

すでにデバッグ モードで実行している場合、プログラムの実行が現在一時停止している場合 (たとえば、既にブレークポイントにいるため)、追加のブレークポイントを設定できます。最新の Pydev で試してみたところ、問題なく動作します。

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

于 2009-05-29T14:14:00.003 に答える