2009-09-08 13 views
85

Czy istnieje sposób programistycznego wymuszenia skryptu Python na REPL w dowolnym momencie jego wykonania, nawet jeśli skrypt został uruchomiony z wiersz poleceń?Jak przejść do REPL (Read, Eval, Print, Loop) z kodu Pythona

Piszę szybki i brudny program kreślący, który chcę odczytać dane ze stdin lub pliku, narysuj go, a następnie wpadnij do REPL, aby umożliwić dostosowanie spisku.

Odpowiedz

78

Można spróbować użyć opcji interaktywnych dla Pythona:

python -i program.py 

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

+13

Gdy jesteś gotowy na ciemną stronę, ipython -i program.py jest dla ciebie. – joeforker

+0

Imponujące i proste. – Nishant

+0

Po prostu rozwaliłeś mój umysł. – Bemmu

16

można uruchomić debugger:

import pdb;pdb.set_trace() 

Nie wiesz, co chcesz rEPL za, ale debugger jest bardzo podobna.

+3

Podejrzewam, że chciałby wprowadzić zmiany na żywo do działającego procesu à la Lisp. – Pinochle

+1

Czy jest jakiś sposób, aby wznowić wykonywanie skryptu, który uruchomił Cię w pdb? –

+0

Mam tendencję do pisania fragmentu kodu w VIM instaed z Pythona zapisz go, a następnie wykonaj! Python -i% na przykład. Lub pdb. To dobry przypadek użycia. – Nishant

38

Oto jak należy to zrobić (ipython> v0.11):

import IPython 
IPython.embed() 

Dla ipython < = v0.11:

from IPython.Shell import IPShellEmbed 

ipshell = IPShellEmbed() 

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

Należy użyć ipython, Cadillac Pythona REPLs . Zobacz http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Z dokumentacji:

Może być również przydatna w naukowych sytuacjach obliczeniowych, gdzie jest wspólne trzeba zrobić automatyczne, obliczeniowo część i następnie przestać patrzeć na dane , działki, itp. Otwarcie instancji IPython da użytkownikowi pełny dostęp do swoich danych i funkcji , a po zakończeniu korzystania z interaktywnej części można wznowić wykonanie programu (perha ps ponownie zatrzymać ponownie, tyle razy, ile potrzeba).

+3

IPython jest świetny, ale jeśli OP chce rozwiązania, które wykorzystuje tylko wbudowany Python, Jason's code.InteractiveConsole() rozwiązanie jest jak "należy" to zrobić. :-) –

102

I często korzystać z tego:

def interact(): 
    import code 
    code.InteractiveConsole(locals=globals()).interact() 
+6

Dokumenty dla modułu "code" znajdują się tutaj: http://docs.python.org/library/code.html –

+36

Możesz to zrobić jeszcze łatwiej: kod importu; code.interact (local = locals()) –

+1

W 'pdb' możesz użyć' interakcji'. – gerrit

14

Aby uzyskać wykorzystanie ipython i funkcjonalność debugera należy użyć ipdb,

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

import ipdb 
ipdb.set_trace() 
0

I właśnie to zrobił w jednym z moich własnych skryptów (biegnie wewnątrz ram automatyki, który jest ogromny PITA do urządzenia):

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 gdziekolwiek chcesz mieć punkt przerwania i możesz sprawdzić stan używając tej samej składni co interpreter python (chociaż nie pozwala ci na import modułów). To nie jest zbyt eleganckie, ale nie wymaga żadnej innej konfiguracji.