Dla moich potrzeb debugowania pdb
jest całkiem niezły. Byłoby jednak dużo fajniejsze (i pomocne), gdybym mógł wejść do ipython
. Czy to możliwe?
81
Istnieje ipdb
projekt, który osadza iPython w standardowym pdb, więc możesz po prostu zrobić:
import ipdb; ipdb.set_trace()
Można go zainstalować za pomocą zwykłego pip install ipdb
.
ipdb
jest dość krótki, więc zamiast easy_installing możesz również utworzyć plik ipdb.py
gdzieś na swojej ścieżce Pythona i wkleić do niego następujące elementy:
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)
ModuleNotFoundError: No module named 'IPython.Debugger'
,ModuleNotFoundError: No module named 'IPython.Shell'
iImportError: cannot import name 'ipapi'
ModuleNotFoundError: No module named 'IPython.Debugger'
,ModuleNotFoundError: No module named 'IPython.Shell'
iImportError: cannot import name 'ipapi'
breakpoint()
się do ipdb.W IPython 0.11 możesz osadzić IPython bezpośrednio w swoim kodzie w ten sposób
Twój program może wyglądać tak
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
Tak się dzieje, gdy go uruchamiasz (arbitralnie wybrałem uruchomienie go w ramach istniejącej sesji ipython. Z mojego doświadczenia wynika, że zagnieżdżanie sesji ipython w ten sposób może spowodować jego awarię).
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
źródło
def f() : pass ; IPython.embed = f
tak, abyembed()
wywołanie było noop, a następnie Ctrl + DJeśli używasz nowocześniejszej wersji IPythona (> 0.10.2), możesz użyć czegoś takiego jak
from IPython.core.debugger import Pdb Pdb().set_trace()
Ale prawdopodobnie lepiej jest po prostu użyć ipdb
źródło
Odpowiednik
import pdb; pdb.set_trace()
z IPythonem wygląda mniej więcej tak:
from IPython.ipapi import make_session; make_session() from IPython.Debugger import Pdb; Pdb().set_trace()
Jest to trochę rozwlekłe, ale dobrze jest wiedzieć, jeśli nie masz zainstalowanego ipdb.
make_session
Wezwanie jest wymagane raz skonfigurować schemat kolorów, itp, aset_trace
połączenia mogą być umieszczone w dowolnym miejscu trzeba złamać.źródło
Zwykle, kiedy używam ipythona, włączam automatyczne debugowanie za pomocą polecenia „pdb” w nim.
Następnie uruchamiam skrypt za pomocą polecenia „uruchom myscript.py” w katalogu, w którym znajduje się mój skrypt.
Jeśli otrzymam wyjątek, ipython zatrzymuje program wewnątrz debugera. Sprawdź polecenie pomocy dla magicznych poleceń ipython (% magic)
źródło
Lubię po prostu wkleić ten jeden wiersz w moich skryptach, w których chcę ustawić punkt przerwania:
__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
Nowsza wersja może używać:
__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
źródło
Wygląda na to, że moduły zostały ostatnio trochę przetasowane. Na IPythonie 0.13.1 działają dla mnie następujące rzeczy
from IPython.core.debugger import Tracer; breakpoint = Tracer() breakpoint() # <= wherever you want to set the breakpoint
Chociaż, niestety, w qtconsole to wszystko jest bezwartościowe .
źródło
Nowsze wersje IPythona zapewniają łatwy mechanizm osadzania i zagnieżdżania sesji IPython w dowolnych programach w języku Python. Możesz postępować zgodnie z następującym przepisem, aby osadzić sesje 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)
Następnie użyj,
ipshell()
gdy chcesz wejść do powłoki IPython. Umożliwi to osadzenie (a nawet zagnieżdżenie) interpreterów IPython w kodzie.źródło
Z dokumentacji IPython :
import IPython.ipapi namespace = dict( kissa = 15, koira = 16) IPython.ipapi.launch_new_instance(namespace)
uruchomi programowo powłokę IPythona. Oczywiście wartości w
namespace
dyktandzie są tylko wartościami fikcyjnymi -locals()
w praktyce może być bardziej sensowne .Zauważ, że musisz to na stałe zakodować w; to nie zadziała tak, jak
pdb
działa. Jeśli tego chcesz, odpowiedź DoxaLogos jest prawdopodobnie bardziej podobna do tego, czego szukasz.źródło
Szybki i łatwy sposób:
from IPython.Debugger import Tracer debug = Tracer()
Następnie po prostu napisz
debug()
gdziekolwiek chcesz rozpocząć debugowanie programu.
źródło
ImportError: No module named 'IPython.Debugger'
na pythonie 3.4 / IPython 3Musiałem to wygooglować kilka razy w ciągu ostatnich kilku dni, więc dodając odpowiedź ... czasami fajnie jest móc normalnie uruchomić skrypt i wpadać do ipython / ipdb tylko w przypadku błędów, bez konieczności wstawiania
ipdb.set_trace()
punktów przerwania do koduipython --pdb -c "%run path/to/my/script.py --with-args here"
(pierwszy
pip install ipython
ipip install ipdb
oczywiście)źródło
ipython --pdb -- ./path/to/my/script --with-args here
To jest całkiem proste:
ipython some_script.py --pdb
Wymaga instalacji iPythona, zwykle działa to:
pip install ipython
Używam ipython3 zamiast ipython, więc wiem, że to najnowsza wersja Pythona.
Jest to łatwe do zapamiętania, ponieważ po prostu używasz iPythona zamiast pythona i dodajesz --pdb na końcu.
źródło
Aby uzyskać REPL IPythona przy użyciu kolorów terminala, musiałem zrobić to:
from IPython import start_ipython start_ipython()
https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython
źródło