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?

Author: Martijn Pieters, 2009-07-14

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)
 106
Author: Daniel Roseman,
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
 49
Author: Alex Gaudio,
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ć.

 11
Author: ars,
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

 11
Author: chrisdev,
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)

 8
Author: Jay Atkinson,
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()
 8
Author: xApple,
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 .

 6
Author: beardc,
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.

 5
Author: Amelio Vazquez-Reina,
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.

 3
Author: David Z,
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.

 3
Author: Viktiglemma,
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)

 2
Author: Anentropic,
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.

 0
Author: Luke Stanley,
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