J'exécute mon programme Python et j'ai un point où il serait utile d'intervenir et de voir ce qui se passe, puis de repartir. Un peu comme un mode console temporaire.
Dans Matlab, j'utiliserais la commande keyboard
pour ce faire, mais je ne suis pas sûr de la nature de la commande en python.
Y a-t-il un moyen de faire cela?
Par exemple:
for thing in set_of_things:
enter_interactive_mode_here()
do_stuff_to(thing)
Lorsque enter_interactive_mode()
appelle, j'aimerais y aller, regarder autour de moi, puis quitter et laisser le programme continuer à fonctionner.
code.interact()
semble fonctionner d'une manière ou d'une autre:
>>> 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 revient à l'interpréteur "principal".
Vous pouvez lire les locaux, mais les modifier ne semble pas fonctionner de cette façon.
python -i myapp.py
Cela exécutera myapp.py
et vous déposer dans le shell interactif. De là, vous pouvez exécuter des fonctions et vérifier leur sortie, avec tout l'environnement (importations, etc.) de myapp.py
chargé.
Pour quelque chose de plus sophistiqué - il serait préférable d'utiliser un débogueur comme pdb
, définissant un point d'arrêt. De plus, la plupart des IDE (PyDev, PyCharm, Komodo ...) ont des débogueurs graphiques.
J'utilise pdb
à cet effet. Je sais qu'Emil l'a déjà mentionné dans sa réponse, mais il n'a pas inclus d'exemple ni expliqué pourquoi cela répond à votre question.
for thing in set_of_things:
import pdb; pdb.set_trace()
do_stuff_to(thing)
Vous pouvez lire et définir des variables en démarrant votre commande avec un point d'exclamation. Vous pouvez également monter et descendre la pile (commandes u
et d
), ce que InteractiveConsole
n'a pas de mécanismes intégrés à faire.
Pour que le programme continue de s'exécuter, utilisez la commande c
. Dans l'exemple ci-dessus, il entrera le débogueur à chaque itération de boucle, donc vous voudrez peut-être encapsuler l'appel set_trace()
dans une phrase if
.
Vous avez des options - Python bibliothèque standard ou IPython.
La bibliothèque Python standard a un module code
qui a une classe InteractiveConsole
dont le but est de "Émuler étroitement le comportement de l'interpréteur interactif Python." Ce serait probablement en mesure de faire ce que vous voulez, mais la documentation n'a pas d'exemples sur la façon de l'utiliser, et je ne 'ai aucune suggestion sur où aller.
IPython , qui est un terminal Python terminal plus avancé, a la possibilité d'incorporer une console à tout moment dans votre programme intégré. Selon leur documentation , vous pouvez simplement faire
from IPython import embed
for thing in set_of_things:
embed()
do_stuff_to(thing)
L'outil le plus confortable pour moi est ipdb .
ipdb exporte des fonctions pour accéder au débogueur IPython, qui comprend la complétion des onglets, la mise en évidence de la syntaxe, de meilleurs retraits, une meilleure introspection avec la même interface que le module pdb.
L'achèvement et l'introspection pratique sont particulièrement utiles pour le débogage.
Vous pouvez utiliser ipdb
.
Pour définir vos points d'arrêt, ajoutez
import ipdb; ipdb.set_trace()
à l'endroit où vous souhaitez accéder au débogueur. Une fois que vous atteignez un point d'arrêt, vous recevrez un shell interactif et quelques lignes de code autour de votre point d'arrêt pour le contexte.https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/
Bien que ce ne soit probablement pas l'option la plus appropriée, quelque chose d'aussi simple que:
try:
while True:
print input()
except:
pass
Couvrira de nombreux cas