web-dev-qa-db-fra.com

Comment passer dans REPL (lecture, évaluation, impression, boucle) à partir de Python

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

J'écris un programme de traçage rapide et sale, dont je veux lire les données depuis stdin ou un fichier, les tracer, puis les déposer dans le REPL pour permettre la personnalisation du tracé.

99
dsimcha

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

python -i program.py

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

95
Alex

J'utilise fréquemment ceci:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()
117
Jason R. Coombs

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 de Python REPLs. Voir http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython =

De la documentation:

Il peut également être utile dans les situations de calcul scientifique où il est courant de devoir effectuer une partie automatique et intensive en calcul, puis de s'arrêter pour regarder les données, les tracés, etc. L'ouverture d'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 arrêter à nouveau plus tard, autant de fois que nécessaire).

42
joeforker

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 en plus:

import ipdb
ipdb.set_trace()
17
bluszcz

Vous pouvez lancer le débogueur:

import pdb;pdb.set_trace() 

Vous ne savez pas ce que vous voulez pour le REPL pour, mais le débogueur est très similaire.

17
Ned Batchelder

Je viens de le faire dans l'un de mes propres scripts (il s'exécute 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 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 laisser faire d'importations de modules). Ce n'est pas très élégant, mais il ne nécessite aucune autre configuration.

0
razorboy