2009-07-14 5 views

답변

104

은 표준 PDB에 iPython를 짜 ipdb 프로젝트가있다, 그래서 당신은 다만 수 : 일반적인 pip install ipdb를 통해

import ipdb; ipdb.set_trace() 

그것은 설치합니다.

ipdb은 매우 짧은, 그래서 대신에 당신은 또한 파이썬 경로 어딘가에 파일 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를위한 별도의 스레드를 생성하고 코드를 편집 할 때마다 스레드를 다시 해석합니다. 이것은 정상적으로 잘 작동하지만 스레드가 죽을 때 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을 포함 할 수 있습니다 (I 임의로 기존의 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

모듈이 최근에 조금 뒤섞여있는 것처럼 보입니다. 나를

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

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

비록 슬프게도, 모든 꽤 worthless in qtconsole있어를 들어 IPython 0.13.1 다음 작품에서.

4

최신 버전의 IPython은 IPython 세션을 모든 Python 프로그램에 포함하고 중첩 할 수있는 쉬운 메커니즘을 제공합니다. 당신은 IPython 세션을 포함 할 the following recipe을 따를 수 있습니다 : 당신이 IPython 쉘에 드롭 할 때마다

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) 

그런 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

관련 문제