84 votes

Est-il possible d'entrer dans ipython à partir du code ?

Pour mes besoins de débogage, pdb est assez bon. Cependant, il serait beaucoup plus cool (et utile) si je pouvais aller dans ipython . Cette chose est-elle possible ?

117voto

Daniel Roseman Points 199743

Il existe un ipdb qui incorpore iPython dans le pdb standard, de sorte que vous pouvez simplement le faire :

import ipdb; ipdb.set_trace()

On peut l'installer par les moyens habituels pip install ipdb .

ipdb est assez court, donc à la place de easy_installing vous pouvez aussi créer un fichier ipdb.py quelque part sur votre chemin Python et collez ce qui suit dans le fichier :

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)

0 votes

Fonctionne étonnamment bien avec Django. Enfin, à part le fait que je ne vois pas le texte que je tape, mais c'est probablement facilement corrigeable (puisque ipdb ne fait que six lignes).

4 votes

En fait, le problème est que Django crée un thread séparé pour le runserver, et à chaque fois que vous faites une modification du code, il relance le thread. Cela fonctionne normalement bien, mais si vous êtes assis dans pdb quand le thread est tué, le terminal devient fou. Vous pouvez résoudre ce problème en sortant de runserver, en lançant 'stty sane', puis en relançant runserver.

1 votes

@daniel-roseman Salut, je reçois ModuleNotFoundError: No module named 'IPython.Debugger' , ModuleNotFoundError: No module named 'IPython.Shell' y ImportError: cannot import name 'ipapi'

59voto

Alex Gaudio Points 774

Dans IPython 0.11, vous pouvez intégrer IPython directement dans votre code comme ceci

Votre programme pourrait ressembler à ceci

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

Voici ce qui se passe lorsque vous l'exécutez (j'ai choisi arbitrairement de l'exécuter à l'intérieur d'une session ipython existante. D'après mon expérience, l'imbrication des sessions ipython peut provoquer un plantage).

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

0 votes

Ce passage dans une session IPython est très cool. Merci beaucoup !

1 votes

J'ai bêtement placé ceci dans une boucle (presque infinie). Comment puis-je en sortir ?

3 votes

@gerrit, appuyez sur Ctrl + d si vous êtes toujours là.

12voto

chrisdev Points 71

Si vous utilisez une version plus moderne d'IPython (> 0.10.2), vous pouvez utiliser quelque chose comme

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

Mais il est probablement préférable d'utiliser ipdb.

11voto

ars Points 35803

L'équivalent de

import pdb; pdb.set_trace()

avec IPython est quelque chose comme :

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

C'est un peu verbeux, mais c'est bon à savoir si vous n'avez pas installé ipdb. Le site make_session Un appel est nécessaire une fois pour configurer le schéma de couleurs, etc. set_trace Les appels peuvent être placés partout où vous avez besoin de faire une pause.

8voto

Jay Atkinson Points 1931

Normalement, lorsque j'utilise ipython, j'active le débogage automatique avec la commande "pdb" qu'il contient.

Je lance ensuite mon script avec la commande "run myscript.py" dans le répertoire où se trouve mon script.

Si je reçois une exception, ipython arrête le programme dans le débogueur. Consultez la commande d'aide pour les commandes magiques d'ipython (%magic)

0 votes

Il n'y a donc aucun moyen d'écrire quelque chose comme ipython.set_trace() ? :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X