Skip to content

„if __name__ == ‚__main__'“ in Python

Python

Dieser Artikel genauer, was if __name__ == ‚__main__‘ bedeutet, was oft in Python-Code geschrieben wird.

Unterstriche can SIE verwirren, aber es ist nur eine if-Anweisung, die besagt: „Führen Sie den following Code aus, wenn der in __name__ gespeicherte Wert die Zeichenfolge ‚__main__‘ ist“. Es ist auch leicht zu verstehen, wenn Sie die Bedeutung von __name__ und ‚__main__‘ kennen. .

Dieser Artikel hat folgenden Inhalt.

  • Was ist __Name__?
  • Was ist „__main__“?
  • Was bedeutet, wenn __name__ == ‚__main__‘ bedeutet?
  • Verwendung von if __name__ == ‚__main__‘
    • Schreiben Sie den Testcode für das Modul
    • Modul als Befehl verwenden
  • Die main()-Funktion in Python

In Python können Buchstabenliterale sowohl durch einfache Anführungszeichen ‚ als auch durch doppelte Anführungszeichen “ dargestellt werden, wenn also __name__ == „__main__“ dieselbe Bedeutung hat.

Was ist __Name__?

Wenn Sie ein Modul importieren, speichert sein Attribut __name__ den Namen des Moduls als Zeichenfolge str. Sie können es mitbekommen. __Name__.

import math
import numpy as np

print(math.__name__)
# math

print(np.__name__)
# numpy

Dasselbe gilt für Module, die SIE definieren.

Erstellen Sie beispielsweise wie folgt ein Modul hello (hello.py). Im Modul ist eine Funktion zur Ausgabe von __name__ definiert.

def func():
    print('Hello!')
    print('__name__ is', __name__)

Wenn Sie dieses Modul hallo und importieren verwenden, sieht es so aus.

import hello

print(hello.__name__)
# hello

hello.func()
# Hello!
# __name__ is hello

Sie sehen, dass der Modulname „hello“ im __name__ des importierten Moduls gespeichert ist.

Was ist „__main__“?

Wie oben erwähnt, WIRD der Modulname beim Import aus einer anderen Datei in __name__ gespeichert.

Wenn SIE die Datei als Skript über die Befehlszeile ausführen, speichert __name__ die Zeichenfolge „__main__“.

Erstellen Sie beispielsweise test_module (test_module.py) und test_main.py, um es zu importieren und zu verwenden.

def func():
    print('    This is func() in test_module.py')
    print('    __name__ is', __name__)


if __name__ == '__main__':
    print("Start if __name__ == '__main__'")
    print('call func()')
    func()
import test_module

print('This is test_main.py')
print('test_module.__name__ is', test_module.__name__)

print('---')
print('call test_module.func()')

test_module.func()

Wenn Sie test_main.py über die Befehlszeile mit dem Python (oder Python3, je nach Umgebung) ausführen, erhalten Sie das folgende Ergebnis.

python3 test_main.py
# This is test_main.py
# test_module.__name__ is test_module
# ---
# call test_module.func()
#     This is func() in test_module.py
#     __name__ is test_module

Wie im Beispiel wird der Modulname „test_module“ im __name__ des importierten Moduls test_module gespeichert.

Wenn Sie daher test_module.py selbst über die Befehlszeile ausführen, erhalten Sie das folgende Ergebnis.

python3 test_module.py
# Start if __name__ == '__main__'
# call func()
#     This is func() in test_module.py
#     __name__ is __main__

Die Zeichenfolge ‚__main__‘ wird in __name__ gespeichert, und der Prozess nach if __name__ == ‚__main__‘: wird ausgeführt.

Daher wird „“ in __name__ gespeichert, wenn es aus einer anderen Datei importiert wird, und die Zeichenfolge „__main__“ wird in __name__ gespeichert, wenn sie von der Befehlszeile mit dem Befehl python (oder python3) ausgeführt WIRD.

Beachten Sie, dass die Zeichenfolge „__main__“ in „__name__“ gespeichert WIRD, selbst WENN der Python-Befehl als Modul mit der Option „-m“ oder im interaktiven Modus ausgeführt WIRD.

python3 -m test_module
# Start if __name__ == '__main__'
# call func()
#     This is func() in test_module.py
#     __name__ is __main__

Was bedeutet, wenn __name__ == ‚__main__‘ bedeutet?

Zusammenfassend lautet der in __name__ gespeicherte Wert wie folgt.

  • Wenn die Datei (Modul) aus einer anderen Datei importiert wird:
    • __Name ist “.
  • If die Datei selbst als Skript mit dem Befehl python (oder python3) ausgeführt WIRD:

Daher bedeutet if __name__ == ‚__main__‘ „Folgenden Code nur ausführen, wenn diese Datei als Skript von der Befehlszeile ausgeführt WIRD“. Wenn die Datei aus einer anderen Datei importiert WIRD, WIRD der Code nicht ausgeführt.

Verwendung von if __name__ == ‚__main__‘

Sie können if __name__ == ‚__main__‘ verwenden, um Testcode für ein Modul zu schreiben oder ein Modul als Befehl verfügbar zu machen.

Schreiben Sie den Testcode für das Modul

Wenn SIE das Ausgabeergebnis einer Funktion eines Moduls überprüfen möchten, schreiben Sie einen Testcode nach if __name__ == ‚__main__‘.

Zum Beispiel im Fall von hello.py oben:

def func():
    print('Hello!')
    print('__name__ is', __name__)

Wenn Sie diese Datei von der Befehlszeile ausführen, passiert nichts, da sie nur eine Funktion definiert.

Fügen Sie hinzu, wenn __name__ == ‚__main__‘.

def func():
    print('Hello!')
    print('__name__ is', __name__)


if __name__ == '__main__':
    func()

Wenn this Datei über sterben Befehlszeile ausgeführt WIRD, WIRD sterben Funktion im Modul gemäß dem Code nach if __name__ == ‚__main__‘ ausgeführt.

python3 hello_if_name.py
# Hello!
# __name__ is __main__

Wenn die Datei aus einer anderen Datei importiert WIRD, WIRD der Code nach if __name__ == ‚__main__‘ nicht ausgeführt, sodass kein zusätzlicher Prozess durchgeführt WIRD.

Modul als Befehl verwenden

Wenn Sie das Modul als Befehl verwenden möchten, können Sie auch if __name__ == ‚__main__‘ verwenden.

Erstellen Sie ein Modul wie folgt.

import sys


def add(a, b):
    return a + b


if __name__ == '__main__':
    print(add(float(sys.argv[1]), float(sys.argv[2])))

Nach if __name__ == ‚__main__‘ werden Befehlszeilenargumente mit sys.argv abgerufen und Funktionen im Modul übergeben.

sys.argv ist eine Liste von Befehlszeilenargumenten, und das erste Element sys.argv[0] ist der Skriptname. Da sie als str gespeichert werden, konvertieren sie sie mit int() und float(), wenn sie sie als Zahl behandeln möchten.

Bei Ausführung über die Befehlszeile mit Argumenten can sterben Funktionen im Modul ausgeführt Werden.

python3 add_module.py 1.2 3.4
# 4.6

Natürlich ist es möglich, andere Dateien zu importieren und zu verwenden. In diesem Fall wird der Code nach if __name__ == ‚__main__‘ nicht ausgeführt.

import add_module

print(add_module.add(100, 200))
# 300

Beachten Sie, dass SIE, WENN SIE das Modul als Befehl verwenden möchten, eine andere Datei für diesen Zweck vorbereiten können.

import sys
import add_module

print(add_module.add(float(sys.argv[1]), float(sys.argv[2])))

Das Ergebnis ist wie folgt.

python3 add_module_command.py 1.2 3.4
# 4.6

In diesem Fall ist if __name__ == ‚__main__‘ nicht erforderlich.

Wenn SIE das argparse-Modul verwenden, um es als Befehl verwenden zu können, ist es möglicherweise sauberer, eine separate Datei zu erstellen.

import argparse
import add_module

parser = argparse.ArgumentParser()
parser.add_argument('a', type=float)
parser.add_argument('b', type=float)

args = parser.parse_args()
print(add_module.add(args.a, args.b))

Das Ergebnis ist wie folgt.

python3 add_module_argparse.py 1.2 3.4
# 4.6

Die main()-Funktion in Python

In Python beginnt der Prozess nicht mit der Funktion main(), wie es in der Sprache C der Fall ist. Selbst wenn Sie eine Funktion namens main definieren, WIRD SIE nicht automatisch mit dieser Funktion gestartet.

Die beiden following Codes haben beide das Ergebnis same.

Schreiben Sie die Funktion main().

def main():
    print('Hello!')


if __name__ == '__main__':
    main()

Verwenden Sie nicht die Funktion main().

Das Ergebnis bei Ausführung über die Befehlszeile ist dasselbe.

python3 hello_main.py
# Hello!

python3 hello_direct.py
# Hello!

Als Konvention, insbesondere bei großen Programmen, darf die Startfunktion main() heißen, aber das dient nur der Übersichtlichkeit und hat in der Python-Spezifikation keine besondere Bedeutung und ist auch nicht vorgeschrieben.