Cómo ingresar a REPL (Leer, Evaluar, Imprimir, Loop) desde el código Python

108

¿Hay alguna manera de forzar mediante programación que un script de Python caiga en un REPL en un punto arbitrario de su ejecución, incluso si el script se inició desde la línea de comandos?

Estoy escribiendo un programa de trazado rápido y sucio, que quiero leer datos de stdin o un archivo, trazarlo y luego colocarlo en el REPL para permitir que el trazado se personalice.

dsimcha
fuente

Respuestas:

104

Podría intentar usar la opción interactiva para Python:

python -i program.py

Esto ejecutará el código en program.py, luego irá al REPL. Todo lo que defina o importe en el nivel superior de program.py estará disponible.

Alex
fuente
21
Cuando esté listo para cambiar al lado oscuro, ipython -i program.py está ahí para usted.
joeforker
Impresionante y simple.
Nishant
126

Con frecuencia uso esto:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()
Jason R. Coombs
fuente
47
Puede hacerlo incluso más simple que eso: importar código; code.interact (local = locales ())
Steven Kryskalla
3
Dentro pdb, puede usar interact.
gerrit
43

Así es como debe hacerlo (IPython> v0.11):

import IPython
IPython.embed()

Para IPython <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

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

Debe usar IPython, el Cadillac de Python REPL. Ver http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

De la documentación:

También puede ser útil en situaciones de computación científica donde es común tener que hacer una parte automática, computacionalmente intensiva y luego detenerse para mirar datos, gráficos, etc. Abrir una instancia de IPython le dará acceso completo a sus datos y funciones. y puede reanudar la ejecución del programa una vez que haya terminado con la parte interactiva (quizás para detenerla más tarde, tantas veces como sea necesario).

joeforker
fuente
3
IPython es genial, pero si el OP quiere una solución que solo use Python incorporado, la solución code.InteractiveConsole () de Jason es como "debería" hacerlo. :-)
Ben Hoyt
18

Para usar iPython y la funcionalidad del depurador, debe usar ipdb ,

Puede usarlo de la misma manera que pdb, con la adición de:

import ipdb
ipdb.set_trace()
bluszcz
fuente
17

Puede iniciar el depurador:

import pdb;pdb.set_trace() 

No estoy seguro de para qué quiere el REPL, pero el depurador es muy similar.

Ned Batchelder
fuente
3
Sospecho que le gustaría hacer cambios en vivo a un proceso en ejecución, a la Lisp.
Pinochle
1
¿Hay alguna forma de reanudar la ejecución del script que lo lanzó a pdb?
Jeff Welling
1
Tiendo a escribir un fragmento de código en VIM instalado en Python, guárdelo y luego haga un! Python -i%, por ejemplo. O pdb. Ese es un buen caso de uso.
Nishant
0

Acabo de hacer esto en uno de mis propios scripts (se ejecuta dentro de un marco de automatización que es un enorme PITA para instrumentar):

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

Simplemente coloque esto donde desee un punto de interrupción, y puede verificar el estado utilizando la misma sintaxis que el intérprete de Python (aunque no parece permitirle realizar importaciones de módulos). No es muy elegante, pero no requiere ninguna otra configuración.

razorboy
fuente