Mam program w języku Python, który tworzę, który można uruchomić na dwa sposoby: pierwszy to wywołanie „python main.py”, który w przyjazny sposób prosi użytkownika o wprowadzenie danych, a następnie uruchamia dane wejściowe użytkownika za pośrednictwem programu. Innym sposobem jest wywołanie "python batch.py -file- ", który przejdzie przez wszystkie przyjazne zbieranie danych wejściowych i uruchomi cały plik wejściowy przez program za jednym razem.
Problem polega na tym, że kiedy uruchamiam "batch.py", importuje on niektóre zmienne / metody / etc z "main.py", a kiedy uruchamia ten kod:
import main
w pierwszym wierszu programu natychmiast wyświetla błąd, ponieważ próbuje uruchomić kod z pliku „main.py”.
Jak mogę powstrzymać Pythona od uruchamiania kodu zawartego w module „głównym”, który importuję?
źródło
Ze względu na sposób działania Pythona konieczne jest, aby uruchamiał moduły podczas ich importu.
Aby zapobiec wykonywaniu kodu w module po zaimportowaniu, ale tylko wtedy, gdy jest uruchamiany bezpośrednio, możesz go chronić za pomocą tego
if
:Możesz chcieć umieścić ten kod w
main()
metodzie, abyś mógł wykonać plik bezpośrednio lub zaimportować moduł i wywołać plikmain()
. Na przykład załóżmy, że to jest w plikufoo.py
.Ten program można uruchomić, przechodząc
python foo.py
lub z innego skryptu Pythona:źródło
Użyj
if __name__ == '__main__'
idiomu -__name__
to specjalna zmienna, której wartość'__main__'
określa, czy moduł jest uruchamiany jako skrypt, a nazwa modułu, jeśli jest importowany. Więc zrobiłbyś coś takiegoźródło
Niestety nie. To jest część tego, jak działa składnia importu i ważne jest, aby tak było - pamiętaj, że
def
faktycznie coś jest wykonywane, gdyby Python nie wykonał importu, utknąłbyś bez funkcji.Ponieważ jednak prawdopodobnie masz dostęp do pliku, możesz sprawdzić, co powoduje błąd. Może być możliwe zmodyfikowanie środowiska, aby zapobiec występowaniu błędu.
źródło
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 oświadczeniem:Następnie, jeśli zadzwonisz funkcja będzie działać. Jeśli importujesz , nie będzie. Dla jasności prawdopodobnie powinieneś zmienić nazwę na inną.
python main.py
main()
main.py
main.py
źródło
Pojawiła się propozycja rozszerzenia Pythona PEP 299, która miała na celu zastąpienie
if __name__ == '__main__':
idiomudef __main__:
, ale została odrzucona. Wciąż dobrze jest wiedzieć, o czym należy pamiętać podczas używaniaif __name__ = '__main__':
.źródło
Możesz napisać swój „main.py” w ten sposób:
źródło
Chociaż nie możesz używać
import
bez uruchomienia kodu; istnieje dość szybki sposób wprowadzania zmiennych; przy użyciunumpy.savez
, który przechowuje zmienne jako tablice numpy w pliku .npz. Następnie możesz załadować zmienne za pomocąnumpy.load
.Zobacz pełny opis w dokumentacji Scipy
Należy pamiętać, że dotyczy to tylko zmiennych i tablic zmiennych, a nie metod itp.
źródło
Spróbuj po prostu zaimportować potrzebne funkcje z main.py? Więc,
Możliwe, że nazwałeś funkcję w batch.py taką samą, jak w main.py, a podczas importu main.py program uruchamia funkcję main.py zamiast funkcji batch.py; wykonanie powyższego powinno to naprawić. Mam nadzieję.
źródło
import main
NIE importuje wszystkiego z main do bieżącej przestrzeni nazw. Dodaje tylko jedenmain
symbol w bieżącej przestrzeni nazw, więc kolizje nie mogą wystąpić.