2014-04-07 9 views
18

Mam skrypty w języku Python, które używają sztuczki if __name__ == '__main__', aby uruchomić jakiś kod, gdy skrypt jest wywoływany jako skrypt, a nie, gdy jest ładowany do interaktywnego interpretera. Jednak, kiedy edytuję te skrypty z IPython za pomocą polecenia %edit, IPython najwyraźniej ustawia __name__ na '__main__', więc kod jest uruchamiany za każdym razem, gdy wychodzę z sesji edycji. Czy istnieje dobry sposób, aby ten kod nie był uruchamiany, gdy moduł jest edytowany z IPython?if __name__ == '__main__' w IPython

Odpowiedz

13

Podczas pracy z wnętrza Emacsa (które zakładam, że jest blisko tego, co można uzyskać z %edit), zazwyczaj użyć tej sztuczki:

if __name__ == '__main__' and '__file__' in globals(): 
    # do what you need 

z oczywistych względów __file__ jest zdefiniowana tylko dla import 'ed modułów, a nie dla powłoki interaktywnej.

+0

Dla tych, którzy nie zdają sobie sprawy, że notebooki Jupyter zostały opracowane z notebooków IPython, zwrócę uwagę, że dodanie drugiej części działa w notebookach Jupyter, dzięki czemu odpowiedni blok kodu nie zostanie uruchomiony po wklejeniu do komórki notebooka. Ponadto, rozważający to może być zainteresowany podejściem opisanym [tutaj] (https://stackoverflow.com/a/22424821/8508004). – Wayne

5

IPython dodaje funkcję get_ipython() do globalnie dostępnych zmiennych. Więc można sprawdzić, czy funkcja ta istnieje w globals() w podjęciu decyzji:

if __name__ == '__main__' and "get_ipython" not in dir(): 
    print "I'm not loaded with IPython" 

Powyższy kod prostu sprawdza, czy istnieje zmienna globalna o nazwie get_ipython. Również sprawdzić, czy zmienna jest wymagalne, można zrobić:

if __name__ == '__main__' and not callable(globals().get("get_ipython", None)): 
    print "I'm not loaded with IPython" 
10

Brzmi to może wystarczy przełącznik -x:

In [1]: %edit 
IPython will make a temporary file named: /tmp/ipython_edit_J8j9Wl.py 
Editing... done. Executing edited code... 
Name is main -- executing 
Out[1]: "if __name__ == '__main__':\n print 'Name is main -- executing'\n" 

In [2]: %edit -x /tmp/ipython_edit_J8j9Wl 
Editing... 

Po wywołaniu %edit -x kod nie jest wykonywany po wyjściu twój edytor.

+0

że przełącznik '-x' jest kluczowy. –

+0

Dzięki; jest to użyteczne, ale nie całkiem robi to, co chcę, ponieważ chcę, aby IPython ładował funkcje/klasy zdefiniowane w module, po prostu nie uruchamiaj kodu testowego powiązanego z modułem. –

+0

Bez problemu. Myślałem, że możesz mieć takie wyjaśnienie. Osobiście polecam odpowiedź @ ffriend w świetle tego. –

Powiązane problemy