2009-07-14 12 views

答えて

104

あり、標準的なPDBにiPythonを埋め込むipdbプロジェクトがあるので、あなただけ行うことができます。

import ipdb; ipdb.set_trace() 

それはいつものpip install ipdb経由でインストール可能です。

ipdbはかなり短いので、代わりにあなたもあなたのPythonパス上のどこかのファイルipdb.pyを作成し、ファイルに次のように貼り付けることができeasy_installingの:

import sys 
from IPython.Debugger import Pdb 
from IPython.Shell import IPShell 
from IPython import ipapi 

shell = IPShell(argv=['']) 

def set_trace(): 
    ip = ipapi.get() 
    def_colors = ip.options.colors 
    Pdb(def_colors).set_trace(sys._getframe().f_back) 
+2

恐ろしい!これはとてもクールです! – Geo

+0

Djangoとうまく機能します。まあ、私が入力しているテキストを見ることができないという事実を除いて、それはおそらく簡単に修正可能です(ipdbの6行だけなので)。 –

+4

実際には、Djangoはrunserverのために別のスレッドをforkし、コードを編集するたびにスレッドをrespawnするという問題があります。これは正常に動作しますが、スレッドが強制終了されたときにpdbに座っていると端末が狂ってしまいます。 runserver、runniny 'stty sane'から抜け出し、runserverをやり直すことでこれを修正できます。 –

8

通常、ipythonを使用すると、その中の "pdb"コマンドで自動デバッグをオンにします。

私のスクリプトがあるディレクトリで "run myscript.py"コマンドを使ってスクリプトを実行します。

例外が発生した場合、ipythonはデバッガ内でプログラムを停止します。 IPython docsからのコマンドipython魔法(マジック%)

+0

のでipython.set_trace(のようなものを書いている方法はありませんに? :) – Geo

3

のヘルプコマンドをチェックアウト:

import IPython.ipapi 
namespace = dict(
    kissa = 15, 
    koira = 16) 
IPython.ipapi.launch_new_instance(namespace) 

がプログラムIPythonシェルを起動します。明らかにnamespace dictの値はダミー値に過ぎません。実際にはlocals()を使用する方が意味があります。

これをハードコードする必要があります。 pdbのように動作しません。それがあなたの望むものなら、DoxaLogosの答えはおそらくあなたが探しているものに似ています。

11

import pdb; pdb.set_trace() 

の同等IPythonは次のようなものです:

from IPython.ipapi import make_session; make_session() 
from IPython.Debugger import Pdb; Pdb().set_trace() 

少し冗長ですが、ipdbがインストールされていないかどうかを知っておくとよいでしょう。 make_sessionコールは、カラースキームなどを設定するために一度必要とされ、set_traceコールは、中断する必要がある場所に配置することができます。

3

簡単高速かつウェイ:あなたはあなたのプログラムのデバッグを開始したいところはどこでも

from IPython.Debugger import Tracer 
debug = Tracer() 

は、それからちょうど

debug() 

を書きます。

+1

'ImportError:Python 3.4/IPython 3の '​​IPython.Debugger''という名前のモジュールがありません – ostrokach

47

IPython 0。11、あなたはあなたのプログラムがこの

In [5]: cat > tmpf.py 
a = 1 

from IPython import embed 
embed() # drop into an IPython session. 
     # Any variables you define or modify here 
     # will not affect program execution 

c = 2 

^D 

これは、あなたがそれを実行したときに何が起こるかであるように見えるかもしれません。この

のようにコード内で直接IPythonを埋め込むことができます(私は、任意の既存のipythonセッション内でそれを実行することを選びました。このようにipythonセッションをネストすると、クラッシュする可能性があります)。

In [6]: 

In [6]: run tmpf.py 
Python 2.7.2 (default, Aug 25 2011, 00:06:33) 
Type "copyright", "credits" or "license" for more information. 

IPython 0.11 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: who 
a  embed 

In [2]: a 
Out[2]: 1 

In [3]: 
Do you really want to exit ([y]/n)? y 


In [7]: who 
a  c  embed 
+0

これはIPythonセッションに落ちることは非常にクールです。どうもありがとうございます! – joon

+1

これを愚かに(ほぼ無限の)ループの内側に配置しました。どうすれば出ることができますか? – gerrit

+2

@gerrit、あなたがまだそこにいるなら、Ctrl + dを押してください。 – confused00

7

私は単に私がブレークポイントを設定したい私のスクリプトでこのワンライナーを貼り付けたい:

__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace() 

新しいバージョンが使用することがあります:

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace() 
11

あなたがしている場合より現代的なバージョンのIPython(> 0.10.2)を使うと、次のようなものを使うことができます。

from IPython.core.debugger import Pdb 
Pdb().set_trace() 

しかし、おそらくipdbを使うほうが良いでしょう。

6

最近少し前にモジュールがシャッフルされたようです。 IPython 0.13.1

from IPython.core.debugger import Tracer; breakpoint = Tracer() 

breakpoint() # <= wherever you want to set the breakpoint 

私のために、次の作品では残念ながら、それはすべてのかなりworthless in qtconsoleだけど。

4

新しいバージョンのIPythonは、IPythonセッションを任意のPythonプログラムに組み込み、ネストするのに簡単なメカニズムを提供します。あなたはIPythonセッションを埋め込むことthe following recipeに従うことができます:

try: 
    get_ipython 
except NameError: 
    banner=exit_msg='' 
else: 
    banner = '*** Nested interpreter ***' 
    exit_msg = '*** Back in main IPython ***' 

# First import the embed function 
from IPython.frontend.terminal.embed import InteractiveShellEmbed 
# Now create the IPython shell instance. Put ipshell() anywhere in your code 
# where you want it to open. 
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg) 

その後、あなたはIPythonシェルにドロップしたいときipshell()を使用しています。これにより、コードにIPythonインタプリタを埋め込む(そしてネストする)ことができます。

2

私は数日前にこの回答を追加するとカップルになってしまいました...時々、スクリプトを正常に実行できるようにして、エラー時にipython/ipdbに落とすだけでipdb.set_trace()ブレークポイント)コード

ipython --pdb -c "%run path/to/my/script.py --with-args here" 

(もちろん最初pip install ipythonpip install ipdb

+1

ありがとう!もう少し簡単です: 'ipython --pdb - ./path/to/my/script-with-args here' – alisianoi

関連する問題