Сомнение (2) ----- Как понять, __name__ == '__ main__' в Python простым способом

1. Резюме

Распространенное понимание __name__ == '__main__': если вас зовут Сяомин.пи, в глазах друзей вы Сяомин (__name__ == '小明'); в ваших собственных глазах вы являетесь самим собой (__name__ == '__main__').

if __name__ == '__main__'Значение: когда файл .py запускается напрямую, if __name__ == '__main__'будет запущен блок кода ниже; когда файл .py импортируется как модуль, if __name__ == '__main__'блок кода ниже не будет запущен.

 

2. Вступление в программу

Для многих языков программирования программа должна иметь точку входа, например C, C ++ и полностью объектно-ориентированные языки программирования Java, C # и т. Д. Если вы имели дело с этими языками, вы должны хорошо понимать концепцию входа в программу. И C, и C ++ должны иметь функцию main в качестве точки входа в программу, то есть работа программы будет начать с основной функции. Точно так же Java и C # должны иметь основной класс, содержащий метод Main в качестве записи программы.

Но Python другой. Он принадлежит к языку сценариев. В отличие от компилируемого языка, программа компилируется в двоичный файл и затем запускается. Вместо этого она динамически интерпретирует и запускается построчно. То есть он запускается с первой строки скрипта, а единой точки входа нет.

Помимо непосредственного запуска файл исходного кода Python (.py) также может использоваться как модуль (то есть библиотека) и импортироваться другими файлами .py. Независимо от того, запущен ли он напрямую или импортирован, будет запущен самый верхний код файла .py (Python использует отступ для различения уровней кода), и когда файл .py импортируется как модуль, мы можем не захотеть, чтобы часть кода была быть запущенным.

2.1 На файл .py ссылаются другие файлы .py

Предположим, у нас есть файл const.py со следующим содержимым:

PI = 3.14

def main():
    print("PI:", PI)

main()

# 运行结果:PI: 3.14

Теперь мы пишем файл area.py для вычисления площади круга. Файл area.py должен использовать переменную PI в файле const.py. Из const.py мы импортируем переменную PI в area.py:

from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print("round area: ", calc_round_area(2))

main()

'''
运行结果:
PI: 3.14
round area:  12.56
'''

2.2 Измените const.py, добавьтеif __name__ == "__main__"

Мы видим, что основная функция в const.py также выполняется. Фактически, мы не хотим, чтобы она выполнялась, потому что основная функция, предоставляемая const.py, предназначена только для проверки определений констант. В этот раз это if __name__ == '__main__'пригодилось. Мы изменили const.py и добавили if __name__ == "__main__":

PI = 3.14

def main():
    print("PI:", PI)

if __name__ == "__main__":
    main()

Запустите const.py, результат будет следующим:

PI: 3.14

Запустите area.py, результат будет следующим:

round area:  12.56

Как и выше, мы можем видеть if __name__ == '__main__'запись программы, эквивалентную моделированию Python.Сам Python этого не требует, это просто привычка кодирования. Из-за взаимных ссылок между модулями разные модули могут иметь такие определения, но это только одна запись программы. Выбор записи программы зависит от __name__значения.
 

3. __name__

3.1  __name__отражать структуру пакета

__name__Это встроенная переменная, которая может использоваться для отражения структуры пакета. Допустим, у нас есть пакет a, структура пакета следующая:

a
├── b
│   ├── c.py
│   └── __init__.py
└── __init__.py

В пакете a c.py,__init__.py,__init__.pyсодержимое файла :

print(__name__)

Когда файл (модуль) .py импортируется другим файлом (модулем) .py, мы выполняем его в командной строке.

python -c "import a.b.c"

Результат вывода:

a
a.b
a.b.c

Это показывает, что он __name__может четко отражать уровень модуля в пакете.

3.2  __name__Представляет имя текущего модуля

__name__Это встроенная переменная, которая может использоваться для представления имени текущего модуля. Запускаем .py файл (модуль) напрямую

python a/b/c.py

Результат вывода:

__main__

Из этого мы можем узнать: если файл .py (модуль) запускается напрямую, он не имеет структуры пакета, а его __name__значением __main__является имя модуля __main__.

Итак, if __name__ == '__main__'смысл таков: когда файл .py запускается напрямую, if __name__ == '__main__'будет запущен приведенный ниже блок кода; когда файл .py импортируется как модуль, if __name__ == '__main__'блок кода ниже не будет запущен.

 

4.  __main__.pyДокументы иpython -m

Параметр -m Python используется для запуска модуля или пакета как сценария, а __main__.pyфайл эквивалентен «начальной программе» пакета.

4.1 Два способа запуска программ Python

  • python xxx.py, Запустите файл xxx.py напрямую
  • python -m xxx.py, Запустите xxx.py как модуль

Предположим, у нас есть файл run.py со следующим содержимым:

import sys

print(sys.path)

Начнем с прямого запуска

python run.py

Результат вывода (чтобы проиллюстрировать проблему, перехватывается только важная часть результата вывода, то же самое ниже):

['/home/huoty/aboutme/pythonstudy/main', ...]

Затем запустите его как модуль:

python -m run.py

Выходной контент

['', ...]
/usr/bin/python: No module named run.py

Поскольку в выводе перечислены только ключевые части, должно быть легко увидеть разницу между ними:

  • Метод прямой работы - поместить каталог, в котором находится файл run.py, в атрибут sys.path.

  • Для запуска в модульном режиме необходимо поместить каталог, в который вы ввели команду (то есть текущий рабочий путь), в атрибут sys.path.

Есть еще одно отличие при работе в модульном режиме: появляется лишняя строка No module named run.pyс ошибкой. Фактически, при запуске в качестве модуля Python сначала выполняет импорт в run.py, поэтому он print(sys.path)успешно выполняется, а затем Python пытается запустить модуль run.py, но в переменной пути нет модуля run.py, поэтому сообщается об ошибке. Правильный способ действовать, так и должно быть python -m run.

4.2  __main__.pyРоль

Давайте сначала посмотрим на пример, предположим, что у нас есть следующий пакет:

package
├── __init__.py
└── __main__.py

Среди них __init__.pyсодержимое файла

import sys

print("__init__")
print(sys.path)

Среди них __main__.pyсодержимое файла

import sys

print("__main__")
print(sys.path)

Затем мы запускаем этот пакет, используем python -m packageкоманду run и выводим результат:

__init__
['', ...]

__main__
['', ...]

Используйте python packageоперацию, результат вывода:

__main__
['package', ...]

В заключение

  • Когда добавлен параметр -m, Python добавит текущий рабочий каталог в sys.path; когда -m не добавлен, Python добавит каталог, в котором находится скрипт, в sys.path.

  • Когда добавлен параметр -m, Python сначала импортирует модуль или пакет, а затем выполнит его.

  • __main__.pyФайл - это программа входа в пакет или каталог. Независимо от того, используется он python packageили python -m packageзапускается, __main__.pyфайл всегда выполняется.
     

5. Справочные статьи

1. Как понять, что name  == ' main ' в Python 

рекомендация

отblog.csdn.net/dongjinkun/article/details/113774675