2010-01-28 14 views
65

Mam moduł Pythona z funkcji:wpaść interpreter Pythona podczas wykonywania funkcji

def do_stuff(param1 = 'a'): 
    if type(param1) == int: 
     # enter python interpreter here 
     do_something() 
    else: 
     do_something_else() 

czy istnieje sposób, aby spaść do linii interpreter poleceń gdzie mam ten komentarz? tak, że jeśli uruchomię następujących w Pythonie:

>>> import my_module 
>>> do_stuff(1) 

ja dostać mój następny wiersz w kontekście zakresu i gdzie mam ten komentarz w do_stuff()?

+0

Możliwy duplikat [Enter Tryb interaktywny Python] (http://stackoverflow.com/questions/13432717/enter-interactive-mode-in-python) –

Odpowiedz

42

Wkładanie

import pdb; pdb.set_trace() 

wejdzie debuggera Pythona w tym momencie

Zobacz tutaj: http://docs.python.org/library/pdb.html

+0

'pdb' jest wielki pyton waniliowy; jeśli masz miejsce na dostarczenie pakietu zewnętrznego, 'ipdb' jest świetny - ta sama funkcjonalność co debugger, ale z podświetlaniem składni, uzupełnianiem tabulacji, itp. z ipython – khstacking

115

Jeśli chcesz standardowego interaktywny wiersz (zamiast debuggera, jak pokazano przez prestomation), możesz to zrobić:

import code 
code.interact(local=locals()) 

Patrz: code module.

Jeśli masz zainstalowany ipython i Chcesz ipython shell zamiast, można to zrobić za ipython> = 0,11:

import IPython; IPython.embed() 

lub starszych wersjach:

from IPython.Shell import IPShellEmbed 
ipshell = IPShellEmbed() 
ipshell(local_ns=locals()) 
+27

dla IPython> = 0.11, nie ma więcej modułu Shell w IPython ... więc uruchom go za pomocą "import IPython, IPython.embed()". – evandrix

+0

Czy można kontynuować po wprowadzeniu 'code.interact()', a la PDB 'c (ontinue)'? –

+3

'code.interact()' jest wywołaniem blokującym. Twój program zatrzyma się i poczeka, aż się skończy. Jeśli opuścisz interaktywny interpreter, twój program powinien zostać wznowiony z instrukcją bezpośrednio po nim. –

14

Jeśli chcesz domyślny interpreter w języku Python, można wykonać:

Umożliwi to dostęp zarówno lokalnym, jak i globalnym.

Jeśli chcesz wpaść do interpretera IPython, IPShellEmbed rozwiązanie jest przestarzałe. Obecnie co działa to:

from IPython import embed 
embed() 
+4

dzięki,' code.interact (local = dict (globals(), ** locals())) 'is so znacznie lepiej niż "kod.interact (local = locals()) 'ponieważ ten drugi powoduje, że ponownie importujesz pakiety – s2t2

+0

Ta odpowiedź działała lepiej dla mnie, ponieważ używałam skryptu bash do wywoływania mojego kodu Pythona. Nie mogłem wchodzić w interakcje z moim kodem Pythona, używając zaakceptowanej odpowiedzi. Dzięki! – jonathanking

Powiązane problemy