Czy można wejść do ipython z kodu?
Dla moich potrzeb debugowania, pdb
jest całkiem dobry. Jednak byłoby dużo chłodniej (i pomocny), gdybym mógł wejść do ipython
. Czy to możliwe?
12 answers
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 ścieżce Pythona i wkleić do pliku 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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-09 00:30:41
W IPython 0.11, możesz osadzić IPython bezpośrednio w kodzie w następujący 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 zdecydowałem się uruchomić go wewnątrz istniejącej sesji ipython. Zagnieżdżanie sesji ipython jak to z mojego doświadczenia może spowodować 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-14 05:00:59
Odpowiednik
import pdb; pdb.set_trace()
Z Ipythonem jest coś w stylu:
from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()
To trochę gadatliwe, ale dobrze wiedzieć, jeśli nie masz zainstalowanego ipdb. Wywołanie make_session
jest wymagane jednorazowo, aby ustawić schemat kolorów itp., a wywołania set_trace
można umieścić w dowolnym miejscu, w którym trzeba przerwać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-15 00:40:39
Jeśli używasz bardziej nowoczesnej wersji IPython (>0.10.2) możesz użyć czegoś w rodzaju
from IPython.core.debugger import Pdb
Pdb().set_trace()
Ale chyba lepiej po prostu użyć ipdb
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-21 10:41:44
Normalnie, kiedy używam ipythona, włączam automatyczne debugowanie za pomocą polecenia" pdb " w środku.
Następnie uruchamiam skrypt z "run myscript.py" polecenie w katalogu, w którym znajduje się mój skrypt.
Jeśli dostanę wyjątek, ipython zatrzyma program wewnątrz debuggera. Sprawdź polecenie pomocy dla magicznych poleceń ipython (%magic)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 18:08:30
Lubię po prostu wkleić ten jednowierszowy do moich skryptów, gdzie 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()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 17:26:14
Wygląda na to, że moduły zostały ostatnio nieco przetasowane. Na IPython 0.13.1 działa u mnie
from IPython.core.debugger import Tracer; breakpoint = Tracer()
breakpoint() # <= wherever you want to set the breakpoint
Choć niestety, to wszystko jest całkiem bezwartościowe w qtconsole .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-22 17:43:14
Nowsze wersje Ipythona zapewniają łatwy mechanizm osadzania i zagnieżdżania sesji Ipythona w dowolnych programach Pythona. Możesz zastosować następujący przepis, 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 wpaść do powłoki IPython. Pozwoli to na osadzenie (a nawet zagnieżdżenie) interpreterów IPython w kodzie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 17:22:12
Z IPython docs :
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
Uruchomi powłokę IPython programowo. Oczywiście wartości w dict namespace
są tylko wartościami atrapy - bardziej sensowne może być użycie locals()
w praktyce.
Zauważ, że musisz to zakodować; to nie będzie działać tak, jak to robi pdb
. Jeśli tego chcesz, odpowiedź DoxaLogos jest prawdopodobnie bardziej podobna do tego, czego szukasz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-14 18:15:32
Szybki i łatwy sposób:
from IPython.Debugger import Tracer
debug = Tracer()
To po prostu napisz
debug()
Gdziekolwiek chcesz rozpocząć debugowanie programu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-03 12:57:03
Musiałem wygooglować to kilka razy w ciągu ostatnich kilku dni, więc dodanie odpowiedzi... czasami miło jest normalnie uruchamiać skrypt i wpadać do ipython / ipdb tylko w przypadku błędów, bez konieczności umieszczania ipdb.set_trace()
punktów przerwania w kodzie
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(pierwszy pip install ipython
i pip install ipdb
Oczywiście)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 17:21:40
To całkiem proste:
ipython some_script.py --pdb
Wymaga instalacji iPython, zazwyczaj działa to:
pip install ipython
Używam ipython3 zamiast ipythona, więc wiem, że to najnowsza wersja Pythona.
Jest to proste do zapamiętania, ponieważ po prostu używasz ipythona zamiast Pythona i dodajesz --pdb na końcu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 13:21:31