Comment déposer dans REPL (lecture, évaluation, impression, boucle) à partir du code Python


109

Existe-t-il un moyen de forcer par programme un script Python à tomber dans une REPL à un moment arbitraire de son exécution, même si le script a été lancé à partir de la ligne de commande?

J'écris un programme de traçage rapide et sale, que je veux lire les données de stdin ou d'un fichier, les tracer, puis les déposer dans le REPL pour permettre au tracé d'être personnalisé.

Réponses:


105

Vous pouvez essayer d'utiliser l'option interactive pour python:

python -i program.py

Cela exécutera le code dans program.py, puis ira au REPL. Tout ce que vous définissez ou importez dans le niveau supérieur de program.py sera disponible.


21
Lorsque vous êtes prêt à passer du côté obscur, ipython -i program.py est là pour vous.
joeforker

Impressionnant et simple.
Nishant

127

J'utilise fréquemment ceci:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()

47
Vous pouvez le faire encore plus simple que cela: importer du code; code.interact (local = locaux ())
Steven Kryskalla

3
À l'intérieur pdb, vous pouvez utiliser interact.
gerrit

43

Voici comment procéder (IPython> v0.11):

import IPython
IPython.embed()

Pour IPython <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

ipshell() # this call anywhere in your program will start IPython

Vous devez utiliser IPython, la Cadillac des REPLs Python. Voir http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

De la documentation:

Cela peut également être utile dans des situations de calcul scientifique où il est courant de devoir faire une partie automatique et intensive en calcul, puis de s'arrêter pour regarder des données, des graphiques, etc. Ouvrir une instance IPython vous donnera un accès complet à vos données et fonctions, et vous pouvez reprendre l'exécution du programme une fois que vous avez terminé avec la partie interactive (peut-être pour l'arrêter plus tard, autant de fois que nécessaire).


3
IPython est génial, mais si l'OP veut une solution qui utilise uniquement Python intégré, la solution code.InteractiveConsole () de Jason est comment vous "devriez" le faire. :-)
Ben Hoyt

18

Pour utiliser iPython et les fonctionnalités du débogueur, vous devez utiliser ipdb ,

Vous pouvez l'utiliser de la même manière que pdb, avec l'ajout de:

import ipdb
ipdb.set_trace()

17

Vous pouvez lancer le débogueur:

import pdb;pdb.set_trace() 

Je ne sais pas à quoi vous voulez faire le REPL, mais le débogueur est très similaire.


3
Je soupçonne qu'il aimerait apporter des modifications en direct à un processus en cours d'exécution, à la Lisp.
Pinochle

1
Existe-t-il un moyen de reprendre l'exécution du script qui vous a lancé dans pdb?
Jeff Welling

1
J'ai tendance à écrire un extrait de code dans VIM instaed de Python, enregistrez-le puis faites un! Python -i% par exemple. Ou pdb. C'est un bon cas d'utilisation.
Nishant le

0

Je viens de faire cela dans l'un de mes propres scripts (il fonctionne dans un cadre d'automatisation qui est un énorme PITA à instrumenter):

x = 0 # exit loop counter
while x == 0:
    user_input = raw_input("Please enter a command, or press q to quit: ")
    if user_input[0] == "q":
        x = 1
    else:
        try:
            print eval(user_input)
        except:
            print "I can't do that, Dave."
            continue

Placez-le simplement là où vous voulez un point d'arrêt, et vous pouvez vérifier l'état en utilisant la même syntaxe que l'interpréteur python (bien qu'il ne semble pas vous permettre d'importer des modules). Ce n'est pas très élégant, mais il ne nécessite aucune autre configuration.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.