Dlaczego Python uruchamia mój moduł, gdy go importuję i jak go zatrzymać?
Mam budowany program w Pythonie, który można uruchomić na dwa sposoby: pierwszy to wywołanie "python main.py", który prosi użytkownika o wprowadzenie w przyjazny sposób, a następnie uruchamia wejście użytkownika przez program. Innym sposobem jest nazwanie " python batch.py - file - ", który przepuści wszystkie przyjazne dane wejściowe i uruchomi cały plik wartości wejściowej przez program za jednym razem.
Problem polega na tym, że kiedy biegam "batch.py" importuje niektóre zmienne / metody / etc from "main.py", a po uruchomieniu tego kodu:
import main
W pierwszej linijce programu, natychmiast popełnia błędy, ponieważ próbuje uruchomić kod w "main.py".
Jak mogę powstrzymać Pythona przed uruchomieniem kodu zawartego w module" main", który importuję?
9 answers
Ponieważ tak właśnie działa Python-słowa kluczowe takie jak class
i def
są , a nie deklaracjami . Zamiast tego są to prawdziwe, żywe polecenia , które są wykonywane. Gdyby nie zostały wykonane Twój moduł byłby .. pusty: -)
W każdym razie, podejście idiomatyczne jest następujące:
# stuff to run always here such as class/def
def main():
pass
if __name__ == "__main__":
# stuff only to run when not called via 'import' here
main()
Zobacz do czego służy if __name__ == "__main__"
?
Wymaga jednak kontroli źródła nad modułem import
ed.
Ze względu na sposób działania Pythona, jest konieczne, aby uruchamiał Twoje Moduły podczas ich importowania.
Aby zapobiec wykonywaniu kodu w module po zaimportowaniu, ale tylko po uruchomieniu bezpośrednio, możesz go zabezpieczyć za pomocą tego if
:
if __name__ == "__main__":
# this won't be run when imported
Możesz umieścić ten kod w metodzie main()
, aby można było wykonać plik bezpośrednio lub zaimportować moduł i wywołać main()
. Na przykład, załóżmy, że jest to w pliku foo.py
.
def main():
print "Hello World"
if __name__ == "__main__":
main()
Ten program może być uruchamiany przez idąc python foo.py
, lub z innego skryptu Pythona:
import foo
...
foo.main()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-29 16:16:09
Użyj idiomu if __name__ == '__main__'
-- {[2] } jest specjalną zmienną, której wartością jest '__main__'
, jeśli moduł jest uruchamiany jako skrypt, a nazwą modułu, jeśli jest importowany. Więc zrobisz coś jak
# imports
# class/function definitions
if __name__ == '__main__':
# code here will only run when you invoke 'python main.py'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-29 16:15:36
Niestety nie. to jest część składni importu i ważne, że tak robi -- pamiętaj {[0] } jest w rzeczywistości czymś wykonanym, gdyby Python nie wykonał importu, zostałbyś, cóż, zatrzymany bez funkcji.
Ponieważ prawdopodobnie masz dostęp do pliku, możesz sprawdzić, co powoduje błąd. Może być możliwe zmodyfikowanie środowiska, aby zapobiec wystąpieniu błędu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-29 16:14:43
Umieść kod wewnątrz funkcji i nie będzie działać, dopóki nie wywołasz funkcji. Powinieneś mieć główną funkcję w swoim main.py. z twierdzeniem:
if __name__ == '__main__': main()
Następnie, jeśli wywołasz "python main.py" zostanie uruchomiona funkcja main (). Jeśli importujesz main.py nie będzie. Również, prawdopodobnie należy zmienić nazwę main.py do czegoś innego dla jasności.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 18:21:43
Możesz napisać swoje "main.py" like this:
#!/usr/bin/env python
__all__=["somevar", "do_something"]
somevar=""
def do_something():
pass #blahblah
if __name__=="__main__":
do_something()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-29 16:17:12
Chociaż nie można użyć import
bez uruchomienia kodu; istnieje dość szybki sposób, w jaki można wprowadzić swoje zmienne; za pomocą numpy.savez
, który przechowuje zmienne jako tablice numpy w.plik npz. Następnie możesz załadować zmienne za pomocą numpy.load
.
Zobacz pełny opis w dokumentacji scipy
Proszę zauważyć, że dotyczy to tylko zmiennych i tablic zmiennych, a nie metod, itd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 06:30:28
Pojawiła się propozycja ulepszenia Pythona PEP 299 , która miała na celu zastąpienie idiomu if __name__ == '__main__':
przez def __main__:
, ale została ona odrzucona. Nadal warto wiedzieć, o czym należy pamiętać podczas używania if __name__ = '__main__':
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 16:31:18
Spróbuj zaimportować potrzebne funkcje z main.py? więc,
from main import SomeFunction
Możliwe, że nazwałeś funkcję w batch.py tak samo jak w main.py, a przy imporcie main.py program uruchamia main.py funkcja zamiast batch.py funkcja; wykonanie powyższego powinno to naprawić. Mam nadzieję.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-29 16:16:53