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
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.
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"
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.
der '-x' Schalter ist entscheidend. –
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. –
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. –
IPython führt automatisch den Code aus, den Sie mit dem Befehl %edit
schreiben. Sie können %edit -x
verwenden, um anzugeben, dass Sie den gerade bearbeiteten Code NICHT ausführen möchten.
http://ipython.org/ipython-doc/stable/api/generated/IPython.core.magics.code.html
- 1. wenn __name__ == '__main__' nicht funktioniert ipython
- 2. Der Geltungsbereich von __name__ == __main__
- 3. Warum macht es das? wenn - __name__ == '__main__'
- 4. PHP-Äquivalent von Pythons __name__ == "__main__"?
- 5. Powershell equivilent von Pythons, wenn __name__ == ‚__main__‘:
- 6. `if __name__ == '__main __' Äquivalent in Ruby
- 7. Python in Emacs: __name__ == '__main__', aber irgendwie nicht
- 8. Python: Argarse importieren und initialisieren Nach wenn __name__ == '__main__'?
- 9. Gibt es ein R-Äquivalent zum Python "if __name__ ==" __main__ ": main()"?
- 10. Gibt es ein Perl-Pendant zu Pythons `if __name__ == '__main __'`?
- 11. Python exec und __name__
- 12. Muss ich vor dem Aufruf von getLogger in Python explizit nach __name__ == "__main__" suchen?
- 13. Rubin entspricht Python __main__
- 14. Ist es üblich, eine Menge Code unter, wenn __name__ == ‚__main__‘ zu schreiben: Aussage
- 15. python joblib Parallel unter Windows funktioniert nicht einmal "wenn __name__ == '__main__':" hinzugefügt wird
- 16. versuchen zu verstehen __self__ == "__main__"
- 17. Warum ist die Funktion main() nicht innerhalb des if '__main__' definiert?
- 18. Was ist der Zweck von __name__?
- 19. Warum haben Python-Instanzen kein Attribut __name__?
- 20. Unittest Ausgabe in IPython
- 21. verwenden __name__ als Attribut
- 22. Wie kann ich __main__ von einem anderen Python-Modul ausführen?
- 23. Was ist __main__.py?
- 24. Zweck einiger Boilerplate-Code in __main__.py
- 25. Es konnten keine Handler für den Logger "__main__" gefunden werden.
- 26. Python: tatsächliche aktuelle Modul (nicht __main__)
- 27. Importieren von Modulen: __main__ vs als Modul importieren
- 28. ipython --pylab vs ipython
- 29. Kann unittest Hauptfunktion in Ipython/Jupyter Notebook nicht ausführen
- 30. Multiprocessing 'apply_async' Ausführung in If-else Block
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