Como entrar no REPL (Ler, Avaliar, Imprimir, Loop) a partir do código Python

109

Existe uma maneira de forçar programaticamente um script Python a cair em um REPL em um ponto arbitrário de sua execução, mesmo se o script foi iniciado a partir da linha de comando?

Estou escrevendo um programa de plotagem rápido e sujo, no qual desejo ler dados de stdin ou um arquivo, plotar e, em seguida, soltar no REPL para permitir que o gráfico seja personalizado.

dsimcha
fonte

Respostas:

105

Você pode tentar usar a opção interativa para python:

python -i program.py

Isso executará o código em program.py e, em seguida, vá para o REPL. Qualquer coisa que você definir ou importar no nível superior de program.py estará disponível.

Alex
fonte
21
Quando você estiver pronto para mudar para o lado negro, ipython -i program.py estará lá para você.
joeforker,
Impressionante e simples.
Nishant
127

Eu freqüentemente uso isto:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()
Jason R. Coombs
fonte
47
Você pode fazer isso ainda mais simples do que isso: importar código; code.interact (local = locals ())
Steven Kryskalla,
3
Dentro pdb, você pode usar interact.
gerrit
43

Veja como você deve fazer isso (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

Você deve usar IPython, o Cadillac de Python REPLs. Consulte http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Da documentação:

Também pode ser útil em situações de computação científica onde é comum precisar fazer alguma parte automática, computacionalmente intensiva e, em seguida, parar para olhar os dados, gráficos, etc. Abrir uma instância IPython dará a você acesso total aos seus dados e funções, e você pode retomar a execução do programa assim que terminar a parte interativa (talvez para parar novamente mais tarde, quantas vezes forem necessárias).

joeforker
fonte
3
IPython é ótimo, mas se o OP deseja uma solução que usa apenas Python embutido, a solução code.InteractiveConsole () de Jason é como você "deve" fazê-lo. :-)
Ben Hoyt,
18

Para usar o iPython e a funcionalidade do depurador, você deve usar ipdb ,

Você pode usá-lo da mesma forma que o pdb, com a adição de:

import ipdb
ipdb.set_trace()
Bluszcz
fonte
17

Você pode iniciar o depurador:

import pdb;pdb.set_trace() 

Não tenho certeza do que você deseja para o REPL, mas o depurador é muito semelhante.

Ned Batchelder
fonte
3
Eu suspeito que ele gostaria de fazer alterações ao vivo em um processo em execução, à la Lisp.
Pinochle,
1
Existe alguma maneira de retomar a execução do script que o lançou no PDB?
Jeff Welling
1
Eu tendo a escrever trechos de código em VIM instaurado em Python, salve-o e faça um! Python -i% por exemplo. Ou pdb. Esse é um bom caso de uso.
Nishant
0

Acabei de fazer isso em um dos meus próprios scripts (ele é executado dentro de uma estrutura de automação que é um grande 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

Basta colocá-lo onde quiser um ponto de interrupção e você pode verificar o estado usando a mesma sintaxe do interpretador python (embora não pareça permitir que você faça importações de módulo). Não é muito elegante, mas não requer nenhuma outra configuração.

razorboy
fonte