Конструкция if __name__ == '__main__' в Python


Конструкцию if __name__ == '__main__' можно встретить практически в каждом Python.

В рамках данного материала будет рассмотрено для чего она предназначена и какими будут последствия если ее не использовать.



Конструкци if __name__ == '__main__': main() в Python определяет какая функция будет исполняться в качестве основной. Обычно вызывается main().



В Python есть понятие namespace. main — основной namespace, с ним происходит работа из оболочки, каждый импортируемый модуль относится к другому namespace, имя которого совпадает с именем модуля.



Если пишется простой CGI скрипт на питоне можно не указывать 'if_name main'. Скрипт при этом будет успешно отрабатывать если выполнять его из консоли или, например, поместить в CRON.

Конструкция добавляется тогда когда написанный скрипт/модуль импортируется для того, чтобы использоваться в других программах.



Пример if name == 'main' в скрипте


Напишет простой скрипт test.py

mcedit test.py

if __name__ == '__main__':
     print ('No module')
else:
     print ('Running where imported a module')



Теперь проведем два эксперимента. Сначала обратимся к скрипту из консоли:

python3 test.py

No module



Теперь авторизуемся в оболочке Python

python3

Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type 'help', 'copyright', 'credits' or 'license' for more information.



И импортируем модуль

>>> import test

Running where imported a module



Конструкция определяющая какой фрагмент кода исполнять фактически всегда указывается последней строкой в скрипте, ниже еще один пример

mcedit test.py

def main():
       print ('It's from main function')

if __name__ == '__main__': main()



Выполняем скрипт из консоли

python3  test.py

It's from main function



Строка выводится, если модуль импортировать действия указанного для функции не произойдет. Оно выполнится только если фактически будет обращение

python3

Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type 'help', 'copyright', 'credits' or 'license' for more information.

>>> import test


На этом этапе строки не выводится. Также не будут выполнены никакие участки настоящей программы.



Чтобы выполнение произошло нужно обратиться к функции.

>> test.main()

It's from main function



Таким образом, if __name__ == '__main__' в python используется для того чтобы предотвратить мгновенное выполнение участков программного кода сразу при импортировании модулей что происходило бы без этой конструкции.


Читайте про виртуальное окружение, в него часто устанавливаются стандартные модули импортируемые в скриптах.

Сказать спасибо