Jak przejść do REPL (Read, Eval, Print, Loop) z kodu Pythona

109

Czy istnieje sposób, aby programowo zmusić skrypt Pythona do przejścia do REPL w dowolnym momencie jego wykonywania, nawet jeśli skrypt został uruchomiony z wiersza poleceń?

Piszę szybki i brudny program do drukowania, który chcę odczytać dane ze standardowego wejścia lub pliku, wykreślić go, a następnie upuścić w REPL, aby umożliwić dostosowanie wykresu.

dsimcha
źródło

Odpowiedzi:

105

Możesz spróbować użyć opcji interaktywnej dla Pythona:

python -i program.py

Spowoduje to wykonanie kodu w program.py, a następnie przejdzie do REPL. Wszystko, co zdefiniujesz lub zaimportujesz na najwyższym poziomie program.py, będzie dostępne.

Alex
źródło
21
Kiedy będziesz gotowy, aby przejść na ciemną stronę, ipython -i program.py jest dla Ciebie.
joeforker
Imponujące i proste.
Nishant,
127

Często używam tego:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()
Jason R. Coombs
źródło
47
Możesz to zrobić jeszcze prościej: zaimportuj kod; code.interact (local = locals ())
Steven Kryskalla
3
Wewnątrz pdbmożesz użyć interact.
gerrit,
43

Oto, jak powinieneś to zrobić (IPython> v0.11):

import IPython
IPython.embed()

Dla IPythona <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

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

Powinieneś użyć IPythona, czyli REPL Cadillaca z Pythona. Zobacz http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Z dokumentacji:

Może być również przydatny w naukowych sytuacjach obliczeniowych, w których często trzeba wykonać jakąś automatyczną, wymagającą dużej mocy obliczeniowej część, a następnie przestać przeglądać dane, wykresy itp. Otwarcie instancji IPython zapewni pełny dostęp do danych i funkcji, i można wznowić wykonywanie programu po zakończeniu pracy z częścią interaktywną (być może w celu ponownego zatrzymania później, tyle razy, ile potrzeba).

joeforker
źródło
3
IPython jest świetny, ale jeśli OP potrzebuje rozwiązania, które używa tylko wbudowanego Pythona, rozwiązanie Jasona code.InteractiveConsole () jest tym, jak „powinieneś” to zrobić. :-)
Ben Hoyt,
18

Aby skorzystać z iPythona i funkcjonalności debuggera należy użyć ipdb ,

Możesz go używać w taki sam sposób jak pdb, z dodatkiem:

import ipdb
ipdb.set_trace()
bluszcz
źródło
17

Możesz uruchomić debugger:

import pdb;pdb.set_trace() 

Nie jestem pewien, do czego chcesz REPL, ale debugger jest bardzo podobny.

Ned Batchelder
źródło
3
Podejrzewam, że chciałby dokonać zmian na żywo w działającym procesie, a la Lisp.
Pinochle,
1
Czy jest jakiś sposób, aby wznowić wykonywanie skryptu, który uruchomił cię w pdb?
Jeff Welling,
1
Zwykle piszę fragment kodu w VIM zamiast Pythona, zapisuję go, a następnie na przykład robię! Python -i%. Lub pdb. To dobry przypadek użycia.
Nishant,
0

Właśnie zrobiłem to w jednym z moich własnych skryptów (działa w ramach automatyzacji, która jest ogromnym instrumentem PITA):

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

Po prostu umieść to w dowolnym miejscu punktu przerwania i możesz sprawdzić stan przy użyciu tej samej składni, co interpreter języka Python (chociaż wydaje się, że nie pozwala na importowanie modułów). Nie jest zbyt elegancki, ale nie wymaga innej konfiguracji.

Razorboy
źródło