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
файл всегда выполняется.