2014-04-07 11 views
18

Ich habe Python-Skripte, die den if __name__ == '__main__' Trick verwenden, damit Code nur ausgeführt wird, wenn das Skript als Skript aufgerufen wird und nicht wenn es in den interaktiven Interpreter geladen wird. Wenn ich diese Skripte von IPython mit dem Befehl %edit bearbeite, setzt IPython jedoch anscheinend __name__ auf '__main__' und der Code wird daher jedes Mal ausgeführt, wenn ich die Bearbeitungssitzung beende. Gibt es eine gute Möglichkeit, diesen Code nicht auszuführen, wenn das Modul von IPython bearbeitet wird?if __name__ == '__main__' in IPython

Antwort

13

Wenn aus Emacs arbeiten (was ich davon ausgehen, ist in der Nähe, was man mit %edit bekommen), ich in der Regel diesen Trick verwenden:

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

Aus offensichtlichen Gründen __file__ definiert ist nur für import 'Ed-Module, und nicht für interaktive Shell.

+0

Für diejenigen, die nicht wissen, dass Jupyter-Notebooks aus IPython-Notebooks entwickelt wurden, werde ich darauf hinweisen, dass der Zusatz des zweiten Teils in Jupyter-Notebooks funktioniert, so dass der dazugehörige Codeblock beim Einfügen in die Zelle eines Notebooks nicht ausgeführt wird. Auch diejenigen, die dies in Erwägung ziehen, könnten an dem Ansatz [hier] interessiert sein (https://stackoverflow.com/a/22424821/8508004). – Wayne

5

IPython fügt den global verfügbaren Variablen die Funktion get_ipython() hinzu. So können Sie testen, ob diese Funktion in globals() existieren Ihre Entscheidung zu treffen:

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

Der obige Code prüft nur, ob es eine globale Variable mit Namen get_ipython. Um auch zu testen, ob diese Variable aufrufbar ist, können Sie tun:

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

Es klingt wie Sie nur den -x Schalter benötigen:

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... 

Wenn Sie %edit -x der Code aufrufen wird nicht, nachdem Sie ausgeführt Ausfahrt dein Redakteur.

+0

der '-x' Schalter ist entscheidend. –

+0

Danke; das ist nützlich, aber es tut nicht ganz das, was ich will, weil ich möchte, dass IPython die im Modul definierten Funktionen/Klassen lädt, führen Sie einfach nicht den Testcode aus, der dem Modul zugeordnet ist. –

+0

Kein Problem. Ich dachte, du hättest so etwas klarstellen können. Ich würde die Antwort von @ffriend im Hinblick darauf persönlich empfehlen. –

Verwandte Themen