코드에서 ipython으로 이동할 수 있습니까?


81

내 디버깅 요구에 pdb대해서는 꽤 좋습니다. 그러나 내가 들어갈 수 있다면 훨씬 더 시원하고 도움이 될 것 ipython입니다. 이것이 가능합니까?

답변:


112

ipdbiPython을 표준 pdb에 포함 하는 프로젝트가 있으므로 다음과 같이 할 수 있습니다.

import ipdb; ipdb.set_trace()

일반적인 .NET을 통해 설치할 수 pip install ipdb있습니다.

ipdb매우 짧기 때문에 easy_installing 대신 ipdb.pyPython 경로에 파일을 만들고 다음을 파일에 붙여 넣을 수도 있습니다.

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)

Django와 놀랍도록 잘 작동합니다. 글쎄, 내가 입력하는 텍스트를 볼 수 없다는 사실을 제외하고는, 아마 쉽게 고칠 수있을 것입니다 (ipdb는 단 6 줄이기 때문입니다).
Xiong Chiamiov

4
실제로 Django는 runserver에 대해 별도의 스레드를 포크하고 코드를 편집 할 때마다 스레드를 다시 생성한다는 문제가 있습니다. 이것은 일반적으로 잘 작동하지만 스레드가 죽을 때 pdb에 앉아 있으면 터미널이 미치게됩니다. runserver, runniny 'stty sane'을 종료 한 다음 runserver를 다시 시작하여이 문제를 해결할 수 있습니다.
Jeremy Dunck 2011 년

1
@ 다니엘 - roseman 안녕하세요, 수 ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'ImportError: cannot import name 'ipapi'
SebMa

1
@memoselyk 안녕하세요, 저는 ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'그리고ImportError: cannot import name 'ipapi'
SebMa

breakpoint()ipdb에 들어가는 함수를 얻는 방법이 있습니다 .
gerrit

53

IPython 0.11에서는 다음과 같이 코드에 직접 IPython을 포함 할 수 있습니다.

프로그램은 다음과 같을 수 있습니다.

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 세션을 중첩하면 충돌이 발생할 수 있습니다).

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

IPython 세션에 들어가는 것은 매우 멋지다. 정말 고맙습니다!
joon

1
나는 어리석게도 이것을 (거의 무한한) 루프 안에 넣었습니다. 어떻게 나갈 수 있습니까?
gerrit 2014 년

2
@gerrit, 아직 거기에 있다면 Ctrl + d를 누르십시오.
confused00

2
@ confused00 6 개월 후 엄청난 무한이되었을 것입니다 ;-)
gerrit

1
@gerrit, 당신은 삽입 루프에 갇혀있는 경우 : def f() : pass ; IPython.embed = f너무 것을 embed()호출이 무 조작 다음 Ctrl + D입니다
MatrixManAtYrService

12

최신 버전의 IPython (> 0.10.2)을 사용하는 경우 다음과 같이 사용할 수 있습니다.

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

하지만 ipdb를 사용하는 것이 더 낫습니다.


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호출 배치 할 수 있습니다 어디서나 당신은 휴식해야합니다.


8

일반적으로 ipython을 사용할 때 내부에 "pdb"명령을 사용하여 자동 디버깅을 설정합니다.

그런 다음 스크립트가있는 디렉토리에서 "run myscript.py"명령을 사용하여 스크립트를 실행합니다.

예외가 발생하면 ipython은 디버거 내에서 프로그램을 중지합니다. 매직 ipython 명령 (% magic)에 대한 도움말 명령을 확인하십시오.


그래서 ipython.set_trace () 같은 것을 작성할 방법이 없습니까? :)
지오

8

중단 점을 설정하려는 스크립트에이 한 줄을 간단히 붙여넣고 싶습니다.

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

최신 버전은 다음을 사용할 수 있습니다.

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

6

최근에 모듈이 뒤섞인 것 같습니다. IPython 0.13.1에서 다음은 나를 위해 작동합니다.

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

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

아아, qtconsole에서는 모두 쓸모가 없습니다 .


5

최신 버전의 IPython은 모든 Python 프로그램에 IPython 세션을 포함하고 중첩 할 수있는 쉬운 메커니즘을 제공합니다. 다음 레시피 에 따라 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 셸에 들어갈 때마다 사용하십시오 . 이를 통해 코드에 IPython 인터프리터를 포함 (및 중첩) 할 수 있습니다.


3

로부터 IPython 워드 프로세서 :

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

프로그래밍 방식으로 IPython 셸을 시작합니다. 분명히 namespacedict 의 값은 더미 값일뿐 locals()입니다. 실제로 사용하는 것이 더 합리적 일 수 있습니다 .

이것을 하드 코딩해야합니다. 그 방식대로 작동하지 않을 것 pdb입니다. 그것이 당신이 원하는 것이라면 DoxaLogos의 대답은 아마도 당신이 찾고있는 것과 더 비슷할 것입니다.


3

빠르고 쉬운 방법 :

from IPython.Debugger import Tracer
debug = Tracer()

그럼 그냥 쓰세요

debug()

프로그램 디버깅을 시작할 때마다.


1
ImportError: No module named 'IPython.Debugger'파이썬 3.4 / IPython 3
ostrokach

2

나는 지난 며칠 동안 이것을 몇 번 google해야 했으므로 답변을 추가했습니다 ... 때로는 스크립트를 정상적으로 실행 ipdb.set_trace()하고 코드 에 중단 점 을 넣지 않고도 오류가 발생하면 ipython / ipdb에 드롭하는 것이 좋습니다.

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

(제 1 pip install ipythonpip install ipdb코스)


1
감사합니다! 좀 더 간단하게 :ipython --pdb -- ./path/to/my/script --with-args here
alisianoi 2015-06-12

0

이것은 매우 간단합니다.

ipython some_script.py --pdb

iPython 설치가 필요하며 일반적으로 다음과 같이 작동합니다. pip install ipython

ipython 대신 ipython3을 사용하므로 최신 버전의 Python임을 알고 있습니다.

python 대신 iPython을 사용하고 끝에 --pdb를 추가하기 때문에 기억하기 쉽습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.