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
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.
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"
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.
że przełącznik '-x' jest kluczowy. –
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. –
Bez problemu. Myślałem, że możesz mieć takie wyjaśnienie. Osobiście polecam odpowiedź @ ffriend w świetle tego. –
IPython automatycznie wykonuje kod, który wpisujesz poleceniem %edit
. Możesz użyć %edit -x
, aby określić, że NIE chcesz uruchamiać kodu, który właśnie edytowałeś.
http://ipython.org/ipython-doc/stable/api/generated/IPython.core.magics.code.html
- 1. jeśli __name__ == '__main__' nie działa ipython
- 2. node.js odpowiednik pythona, jeśli __name__ == '__main__'
- 3. Python: Importuj i uruchom Argparse After, jeśli __name__ == '__main__'?
- 4. python joblib Równolegle w systemie Windows nie działa nawet "jeśli __name__ == '__main__": "dodano
- 5. `jeśli __name__ == '__main __'` odpowiednik w Ruby
- 6. Wyjście unittest w IPython
- 7. Importowanie modułów: __main__ vs import jako moduł
- 8. Jak uzyskać nazwę pliku modułu __main__ w Pythonie?
- 9. Czy istnieje odpowiednik Perla dla `jeśli __name__ == '__main __'`?
- 10. Nie można znaleźć żadnych programów obsługi dla rejestratora "__main__"
- 11. Jak zdefiniowana jest zmienna __name__ w module Pythona?
- 12. Python: określ rzeczywisty moduł prądowy (nie __main__)
- 13. Co to jest __main__.py?
- 14. Czy istnieje sposób, aby moduł nosowy Pythona działał tak samo w __main__ i w linii poleceń?
- 15. Jakie są różne możliwe wartości __name__ w skrypcie Pythona i co one oznaczają?
- 16. Czyszczenie ekranu w IPython
- 17. if {} in if: endif
- 18. If ... else if ... else w REBOL
- 19. IF - ELSE IF - ELSE Struktura w Excelu
- 20. W konsoli IPython (Spyder), czy mogę uzyskać dostęp do zmiennej z main() po uruchomieniu mojego programu?
- 21. Dobry sposób na edycję poprzedniej zdefiniowanej klasy w ipython
- 22. #if debug -> #if myOwnConfig?
- 23. MySQL INSERT IF (zwyczaj if)
- 24. Dlaczego moduł wieloprocesowy Pythona importuje __main__ podczas rozpoczynania nowego procesu w systemie Windows?
- 25. if..else vs if() {return}
- 26. Zmień rozdzielczość imshow w ipython
- 27. Błąd Pyzmq w IPython Notebook
- 28. Automatyczne ładowanie modułów w IPython
- 29. "Tabele Zebry" w Notatniku IPython?
- 30. Odpowiednik raw_input w laptopie Ipython
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