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é.

dsimcha
la source

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.

Alex
la source
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()
Jason R. Coombs
la source
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).

Joeforker
la source
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()
bluszcz
la source
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.

Ned Batchelder
la source
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.

razorboy
la source