Pytanie Czy można przejść do ipython z kodu?


Do moich potrzeb związanych z debugowaniem, pdb jest całkiem niezły. Jednak tak by było dużo chłodniej (i pomocny), gdybym mógł wejść ipython. Czy to jest możliwe?


76
2017-07-14 17:45


pochodzenie




Odpowiedzi:


Tam jest ipdb projekt, który osadza iPython w standardowym pdb, dzięki czemu możesz po prostu:

import ipdb; ipdb.set_trace()

Można go zainstalować, jak zwykle 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 wklej do pliku:

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
2017-07-14 18:18



Niesamowite! To jest takie fajne! - Geo
Działa niesamowicie dobrze z Django. Cóż, z wyjątkiem faktu, że nie widzę tekstu, który piszę, ale to prawdopodobnie można łatwo naprawić (ponieważ ipdb ma tylko sześć linii). - Xiong Chiamiov
W rzeczywistości problem polega na tym, że Django wyświetla osobny wątek dla runserver, a za każdym razem, gdy dokonasz edycji kodu, odradza się wątek. Zwykle działa dobrze, ale jeśli siedzisz w pdb, gdy wątek zostanie zabity, terminal staje się szalony. Możesz to naprawić, wyłamując się z runserver, runniny 'stty sane', a następnie ponownie uruchamiając runserver. - Jeremy Dunck
@ daniel-roseman Cześć, dostaję ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell' i ImportError: cannot import name 'ipapi' - SebMa
@memoselyk Cześć, dostaję ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell' i ImportError: cannot import name 'ipapi' - SebMa


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 dzieje się, gdy go uruchomisz (arbitralnie zdecydowałem się uruchomić go w istniejącej sesji na ipythonie, ponieważ takie sesje z ipythona mogą 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
2017-09-14 05:00



To wchodzenie w sesję IPython jest bardzo fajne. Dziękuję bardzo! - joon
Głupio umieściłem to w pętli (prawie nieskończonej). Jak mogę się wydostać? - gerrit
@gerrit, naciśnij Ctrl + D, jeśli wciąż tam jesteś. - confused00
@ confused00 Byłoby to potężnie nieskończone, 6 miesięcy później ;-) - gerrit
Jedna zaleta tego już się skończyła pdb i ipdb jest to, że wszelkie wyjątki spowodowane przez uruchamiany kod otrzymują pełne informacje zwrotne (ponieważ nie jesteś już "w" jednym). Jest to dla mnie bardzo przydatne, ponieważ mam tendencję do używania pdb jako sposób na ustawienie grupy zmiennych dla powłoki interaktywnej. - Xiong Chiamiov


Odpowiednik

import pdb; pdb.set_trace()

z IPythonem jest coś takiego:

from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()

Jest trochę gadatliwy, ale dobrze wiedzieć, jeśli nie masz zainstalowanego ipdb. The make_session połączenie jest wymagane raz, aby skonfigurować schemat kolorów, itp. i set_trace Połączenia można umieszczać w dowolnym miejscu, aby się zepsuć.


11
2017-07-15 00:40





Jeśli używasz nowszej wersji IPython (> 0.10.2), możesz użyć czegoś podobnego

from IPython.core.debugger import Pdb
Pdb().set_trace()

Ale prawdopodobnie lepiej jest po prostu użyć ipdb


11
2017-09-21 10:41





Zwykle, gdy używam ipython, włączam automatyczne debugowanie za pomocą komendy "pdb" w środku.

Następnie uruchamiam skrypt za pomocą polecenia "run myscript.py" w katalogu, w którym znajduje się mój skrypt.

Jeśli otrzymam wyjątek, ipython zatrzyma program wewnątrz debuggera. Sprawdź komendę pomocy dla magicznych komend ipython (% magic)


8
2017-07-14 18:08



więc nie ma możliwości napisania czegoś takiego jak ipython.set_trace ()? :) - Geo


Lubię po prostu wklejać ten tekst 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
2017-08-29 11:58





Wygląda na to, że moduły zostały ostatnio nieco przetasowane. Na IPythonie 0.13.1 działa to dla mnie

from IPython.core.debugger import Tracer; breakpoint = Tracer()

breakpoint() # <= wherever you want to set the breakpoint

Choć niestety, wszystko jest ładne bezwartościowe w qtconsole.


6
2018-01-22 17:43





Nowsze wersje IPythona zapewniają łatwy mechanizm osadzania i zagnieżdżania sesji IPython w dowolne programy Pythona. Możesz śledzić następujący przepis osadzać 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() za każdym razem, gdy chcesz wpaść w powłokę IPython. Umożliwi to osadzenie (a nawet zagnieżdżenie) interpreterów IPython w kodzie.


4
2018-03-27 17:22