barplot - Entrar en modo interactivo en Python
pandas plot (7)
Estoy ejecutando mi programa Python y tengo un punto en el que sería útil saltar y ver qué está pasando, y luego volver a salir. Algo así como un modo de consola temporal.
En Matlab, usaría el comando del keyboard
para hacer esto, pero no estoy seguro de cuál es el comando en python.
¿Hay alguna forma de hacer esto?
Por ejemplo:
for thing in set_of_things:
enter_interactive_mode_here()
do_stuff_to(thing)
Cuando enter_interactive_mode()
llama, me gustaría ir allí, mirar a mi alrededor y luego salir y dejar que el programa continúe ejecutándose.
La herramienta más cómoda para mí es ipdb .
ipdb exporta funciones para acceder al depurador de IPython, que incluye la terminación de pestañas, el resaltado de sintaxis, mejores tracebacks, mejor introspección con la misma interfaz que el módulo pdb.
La finalización y la introspección útil son especialmente útiles para la depuración.
Puedes usar ipdb
.
Para establecer sus puntos de interrupción, agregue
import ipdb; ipdb.set_trace()
import ipdb; ipdb.set_trace()
donde desea saltar al depurador. Una vez que llegue a un punto de interrupción, se le dará un shell interactivo y unas pocas líneas de código alrededor de su punto de interrupción para el contexto.https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/
Si bien es probable que no sea la opción más apropiada, algo tan simple como:
try:
while True:
print input()
except:
pass
Cubrirá muchos casos
Tiene opciones: biblioteca estándar de Python o IPython.
La biblioteca estándar de Python tiene un módulo de code
que tiene una clase InteractiveConsole
cuyo propósito es "Emular de cerca el comportamiento del intérprete interactivo de Python". Es probable que esto sea capaz de hacer lo que quiera, pero la documentación no tiene ningún ejemplo sobre cómo usar esto, y no tengo ninguna sugerencia sobre dónde ir.
IPython , que es un terminal de Python más avanzado, tiene la opción de integrar una consola en cualquier punto de su programa integrado. De acuerdo con su documentation , simplemente puede hacer
from IPython import embed
for thing in set_of_things:
embed()
do_stuff_to(thing)
Yo uso pdb
para este propósito. Me doy cuenta de que Emil ya lo mencionó en su respuesta, pero no incluyó un ejemplo ni explicó por qué responde a su pregunta.
for thing in set_of_things:
import pdb; pdb.set_trace()
do_stuff_to(thing)
Puede leer y establecer variables iniciando su comando con un signo de exclamación. También puede subir y bajar la pila (comandos u
y d
), para lo cual InteractiveConsole
no tiene mecanismos integrados para hacerlo.
Para que el programa continúe ejecutándose, use el comando c
. En el ejemplo anterior, ingresará al depurador en cada iteración de bucle, por lo que es posible que desee envolver la llamada set_trace()
en una oración if
.
code.interact()
parece funcionar de alguna manera:
>>> import code
>>> def foo():
... a = 10
... code.interact(local=locals())
... return a
...
>>> foo()
Python 3.6.5 (default, Apr 1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> a
10
Ctrl + Z vuelve al intérprete "principal".
Puedes leer los locales, pero modificarlos no parece funcionar de esta manera.
python -i myapp.py
Esto ejecutará myapp.py
y te dejará en la shell interactiva. Desde allí puede ejecutar funciones y verificar su salida, con todo el entorno (importaciones, etc.) de myapp.py
cargado.
Para algo más sofisticado, sería mejor usar un depurador como pdb
, estableciendo un punto de interrupción. Además, la mayoría de los IDE (PyDev, PyCharm, Komodo ...) tienen depuradores gráficos.