Это несложно, на самом деле.
Когда ты делаешь
import module_name
, Питон ищет либо файл module_name.py, либо пакет module_name. Про пакеты пока говорить не будем. Если такой файл нашелся, и он ещё не был импортирован, то он выполняется в контексте импортирующего скрипта. При этом получается объект-модуль, и ссылка на него помещается в переменную module_name в импортирующем скрипте.
Пример:
# a.py
def somefunc():
print('Hi!')
print('a is executed')
# b.py
import a # >>> a is executed
a.somefunc() # >>> Hi!
Имя, под которым импортируется модуль, помещается в переменную __name__. Изменим код так:
# a.py
def somefunc():
print('Hi!')
print(__name__, 'is executed')
# b.py
import a # >>> a is executed
a.somefunc() # >>> Hi!
print('And I am', __name__) # >>> And I am __main__
Таким образом, мы видим, что для исполняемого скрипта переменная __name__ содержит строку "__main__", а импортируемые скрипты увидят в ней только своё имя. Причем неважно, если ты переименуешь модуль:
# a.py
def somefunc():
print('Hi!')
print(__name__, 'is executed')
# b.py
# импортируем модуль и переименовываем его
import a as d # >>> a is executed
d.somefunc() # >>> Hi!
print('And I am', __name__) # >>> And I am __main__
Именно эта особенность и позволяет писать код, который выполнится только если питон-скрипт выполняется непосредственно.
# a.py
# Этот код выполнится в любом случае
def somefunc():
print('Hi!')
if __name__ == '__main__':
# этот код выполнится только если a выполняется непосредственно
print(__name__, 'is executed') # Всегда выведет __main__ is executed
else:
# а этот код выполнится только если a импортируется в другой модуль
print('Imported as', __name__)
# b.py
import a # >>> Imported as a
a.somefunc() # >>> Hi!
print('And I am', __name__) # >>> And I am __main__