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ę?

Author: Harry Johnston, 2011-06-29

9 answers

Ponieważ tak właśnie działa Python-słowa kluczowe takie jak class i def, 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 imported.

Szczęśliwego kodowania.
 166
Author: ,
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
2013-01-26 20:20:42

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()
 31
Author: Jeremy Banks,
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'
 6
Author: Ismail Badawi,
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.

 4
Author: cwallenpoole,
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.

 3
Author: Matt,
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()
 2
Author: hgoldfish,
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.

 0
Author: user3569257,
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__':.

 -1
Author: Paul Tobias,
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ę.

 -3
Author: Dave Lewis,
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