web-dev-qa-db-fra.com

Entrez en mode interactif dans Python

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.

48
Richard

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.

52
Kos
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.

46
Emil Ivanov

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.

17
Lauritz V. Thaulow

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)
10
Sam Mussmann

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.

4
g1zmo

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/

3
fredrik

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

0
Eric