Python: зачем нужен if __name__ == “__main__” ?

Автор: | 12/09/2014

PythonВо многих модулях можно встретить конструкцию вида:

if __name__ == "__main__":
    func()

Её основное назначение – разделение кода, который будет выполнятся при вызове кода как модуля (при импортировании его в другой скрипт) – и при запуске самого модуля, как отдельного файла.

Возьмём такой пример.

Скрипт 1:

#!/usr/bin/env python

print('Script 1. My name is: %s' % __name__)
print('This is simple code from script 1')

def func():
        print('This is code from function from script 1')

if __name__ == "__main__":
    func()

И Скрипт 2:

#!/usr/bin/env python

print('Script2. My name is: %s' % __name__)
print('Importing ifname1')
import ifname1

Результат выполнения Скрипта 2:

[simterm]

$ ./ifname2.py
Script2. My name is: __main__
Importing ifname1
Script 1. My name is: ifname1
This is simple code from script 1

[/simterm]

И запуск Скрипта 1 отдельно:

[simterm]

$ ./ifname1.py
Script 1. My name is: __main__
This is simple code from script 1
This is code from function from script 1

[/simterm]

Ещё один наглядный пример.

Скрипт 1:

#!/usr/bin/env python

if __name__ == "__main__":
    print('I am running as an independent program with name = %s' % __name__)
else:
    print('I am running as an imported module with name = %s' % __name__)

И Скрипт 2 – без изменений:

#!/usr/bin/env python

print('Script2. My name is: %s' % __name__)
print('Importing ifname1')
import ifname1

Запуск Скрипта 2 даст такой результат:

[simterm]

$ ./ifname2.py
Script2. My name is: __main__
Importing ifname1
I am running as an imported module with name = ifname1

[/simterm]

Тогда как прямой вызов Скрипта 1 – такой:

[simterm]

$ ./ifname1.py
I am running as an independent program with name = __main__

[/simterm]