2015-02-11 10 views
5

mam trochę kodu:Czy mogę spowodować, aby program ipython zakończył kod wywołujący?

form IPython import embed 
for item in my_item_list: 
    embed() 

Gdybym następnie uruchomić ten program z

python my_example_program.py 

na pierwszej iteracji przez pętlę dostaję umieścić w powłoce ipython i może wglądu item a środowisko, jak chciałbym.

Po zamknięciu ipython wznawia się pętla, a następnie mogę sprawdzić, czy następna wersja item i środowisko są zgodne z oczekiwaniami.

Czy istnieje sposób dla mnie, aby zamknąć ten kod z poziomu ipython (tak, że jestem wrócił do zachęty powłoki). w jakikolwiek inny sposób niż otwarcie innej powłoki i zabicie procesu?

Odpowiedz

7

Istnieje polecenie %kill_embedded w IPython.
Nie powoduje to bezpośredniego powrotu do wiersza powłoki, ale pomija inne instancje osadzania.

from IPython import embed 

for item in range(5): 
    print 'embedding', item 
    embed() 

A oto wyjście:

$ python my_example_program.py 
embedding 0 
Python 2.7.9 (default, Dec 13 2014, 22:30:33) 
Type "copyright", "credits" or "license" for more information. 

IPython 1.1.0 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: print item 
0 

In [2]: ^D 

embedding 1 
Python 2.7.9 (default, Dec 13 2014, 22:30:33) 
Type "copyright", "credits" or "license" for more information. 

IPython 1.1.0 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [2]: %kill_embedded 
Are you sure you want to kill this embedded instance (y/n)? [y/N] y 
This embedded IPython will not reactivate anymore once you exit. 

In [3]: print item 
1 

In [4]: 

embedding 2 
embedding 3 
embedding 4 
$ 

UPD (03.06.2016): Wydaje się, że funkcja %kill_embedded jest rodzajem uszkodzony w ipython 4,0; możesz użyć %exit_raise, która spowoduje zgłoszenie wyjątku i powrót do powłoki.

+0

pomijanie innych instancji osadzania jest dokładnie tym, czego chciałem, dziękuję. –

+0

@ MikeH-R Nie ma za co! –

+0

Co dokładnie zrobiłeś na ostatnim wejściu, tylko zwykły CTRL + D? Próbuję odtworzyć ten przykład w IPython 4.0, ale zawsze muszę przejść przez wszystkie 'embed's w pętli. Wygląda na to, że '% kill_embedded' faktycznie nie ma żadnego efektu. – bluenote10

Powiązane problemy