Mam moduł Pythona z funkcją:
def do_stuff(param1 = 'a'):
if type(param1) == int:
# enter python interpreter here
do_something()
else:
do_something_else()
czy jest sposób, aby wpaść do interpretera wiersza poleceń, w którym mam komentarz? tak, że jeśli uruchomię następujące w Pythonie:
>>> import my_module
>>> do_stuff(1)
otrzymuję następny monit dotyczący zakresu i kontekstu, w którym mam komentarz do_stuff()
?
Odpowiedzi:
Wstawianie
import pdb; pdb.set_trace()
wejdzie w tym momencie do debugera Pythona
Zobacz tutaj: http://docs.python.org/library/pdb.html
źródło
pdb
jest świetnym pytonem waniliowym; jeśli masz miejsce na wprowadzenie zewnętrznego pakietu,ipdb
jest świetny - ta sama funkcjonalność co debugger, ale z podświetlaniem składni, uzupełnianiem kart itp. ipythonipdb
została wycofana, obecnie używampdbpp
(pdb++
) , która ma podobne funkcje i działa zimport pdb; pdb.set_trace()
(tj. Łata ten import, więc jest to zamiennik typu drop-in)ipdb
zostało wycofane? Nie mogę znaleźć żadnych wiadomości na ten temat.ipdb
wcześniej, alepdbpp
Jeśli potrzebujesz standardowego interaktywnego monitu (zamiast debuggera, jak pokazano w prestomation), możesz to zrobić:
import code code.interact(local=locals())
Zobacz: moduł kodu .
Jeśli masz zainstalowany IPython i chcesz zamiast tego mieć powłokę IPython, możesz to zrobić dla IPython> = 0.11:
import IPython; IPython.embed()
lub dla starszych wersji:
from IPython.Shell import IPShellEmbed ipshell = IPShellEmbed() ipshell(local_ns=locals())
źródło
code.interact()
, a la PDBc(ontinue)
?code.interact()
jest połączeniem blokującym. Twój program zatrzyma się i zaczeka na zakończenie. Jeśli wyjdziesz z interaktywnego interpretera, program powinien wznowić działanie z instrukcją występującą bezpośrednio po nim.help
Jeśli potrzebujesz domyślnego interpretera Pythona, możesz to zrobić
import code code.interact(local=dict(globals(), **locals()))
Umożliwi to dostęp zarówno do lokalnych, jak i globalnych.
Jeśli chcesz skorzystać z interpretera IPythona,
IPShellEmbed
rozwiązanie jest przestarzałe . Obecnie działa:from IPython import embed embed()
źródło
code.interact(local=dict(globals(), **locals()))
jest o wiele lepsze niż to,code.interact(local=locals())
że to drugie sprawia, że ponownie importujesz pakiety