함수를 실행하는 동안 파이썬 인터프리터에 드롭


90

함수가있는 파이썬 모듈이 있습니다.

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

주석이있는 명령 줄 인터프리터로 이동하는 방법이 있습니까? 그래서 파이썬에서 다음을 실행하면 :

>>> import my_module
>>> do_stuff(1)

내가 의견이있는 곳의 범위와 맥락에서 다음 메시지를 do_stuff()받습니까?


답변:


61

삽입

import pdb; pdb.set_trace()

그 시점에서 파이썬 디버거에 들어갑니다.

여기를 참조하십시오 : http://docs.python.org/library/pdb.html


pdb훌륭한 바닐라 비단뱀입니다. 외부 패키지에 데려위한 공간이있는 경우, ipdb중대하다 - 디버거와 같은 기능을하지만, 등 ipython의 구문 강조, 탭 완성,와
khstacking

업데이트 - ipdb사용되지 않습니다, 요즘 내가 사용하는 pdbpp( pdb++) 와 유사한 기능을 가지고있는, 그리고와 작품 import pdb; pdb.set_trace()(가 드롭 인 교체 그래서 즉 그것은, 그 수입 패치)
driftcatcher

@hangtwenty : 왜 ipdb더 이상 사용되지 않는다고 합니까? 그 소식을 찾을 수 없습니다.
Nick Matteo

@Kundor 허, 당신 말이 맞아요. 저자가 프로젝트 유지를 중단하고 대신 사용할 다른 프로젝트를 가리 켰던 어딘가를 읽은 것을 분명히 기억합니다. 그게 잠시 일어났다가 부활했을까요? 내가 틀렸을 수도있다! 어느 쪽이든, 나는 ipdb전에 즐겼 지만 그 pdbpp이후로 즐겼다
driftcatcher

142

디버거 대신 표준 대화 형 프롬프트를 원하면 다음과 같이 할 수 있습니다.

import code
code.interact(local=locals())

참조 : 코드 모듈 .

IPython이 설치되어 있고 대신 IPython 셸이 필요한 경우 IPython> = 0.11에 대해 다음을 수행 할 수 있습니다.

import IPython; IPython.embed()

또는 이전 버전의 경우 :

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())

27
IPython> = 0.11의 경우 IPython에 더 이상 모듈 셸이 없으므로 대신 "import IPython; IPython.embed ()"를 사용하여 시작합니다.
evandrix 2011 년

code.interact()a la PDB를 입력 한 후 계속할 수 c(ontinue)있습니까?
Nick T

4
code.interact()차단 호출입니다. 프로그램이 중지되고 완료 될 때까지 기다립니다. 대화 형 인터프리터를 종료하면 바로 다음 명령문과 함께 프로그램이 다시 시작됩니다.
Matt Anderson

1
대화 형 프롬프트와 디버거의 차이점은 무엇입니까?
StockB

1
@StockB 중요하게 만드는 표준 대화 형 프롬프트입니다. 디버거는 대화 형 프롬프트하지만 같은 아니에요. PDB에서는 여러 줄 문을 수행 할 수없고 내장 함수가 무시됩니다.help
kbrose

28

기본 Python 인터프리터를 원하는 경우 다음을 수행 할 수 있습니다.

import code
code.interact(local=dict(globals(), **locals()))

이렇게하면 로컬 및 글로벌 모두에 액세스 할 수 있습니다.

IPython 인터프리터를 사용하려는 경우 IPShellEmbed솔루션은 구식 입니다. 현재 작동하는 것은 다음과 같습니다.

from IPython import embed
embed()

8
감사 합니다. 후자가 패키지를 다시 가져 code.interact(local=dict(globals(), **locals()))code.interact(local=locals())
오게

이 대답은 bash 스크립트를 사용하여 Python 코드를 호출했기 때문에 더 잘 작동했습니다. 받아 들여진 대답을 사용하여 파이썬 코드와 상호 작용할 수 없습니다. 감사!
jonathanking
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.