Сообщить об ошибке.

Выполнение модуля как скрипта

Любой файл с расширением .py, содержащий модуль, по сути, также является скриптом Python, и нет никаких причин, по которым он не может быть выполнен.

Файл md.py:

a = [100, 200, 300]

def fib(n):
    """печатает ряд Фибоначчи до n"""
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

class Foo:
    pass

Этот файл можно выполнить как сценарий:

$ python3 md.py
$

В файле md.py только определяются объекты и по этому выполнение файла не генерирует никакого результата. Изменим модуль md.py, так что-бы запуск генерировал какие то результаты:

a = [100, 200, 300]

def fib(n):
    """печатает ряд Фибоначчи до n"""
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

class Foo:
    pass

print(a)
fib(500)

Запустим скрипт еще раз. Теперь он выведет результат.

$ python3 md.py
# [100, 200, 300]
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
$

Попробуем импортировать измененный модуль md.py. Теперь он также генерирует выходные данные при импорте в виде модуля:

>>> import md
# [100, 200, 300]
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Обычно модуль не генерирует выходные данные при импорте. Было-бы неплохо, если можно было различать, когда файл загружается как модуль и когда он запускается как автономный скрипт?

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

a = [100, 200, 300]

def fib(n):
    """печатает ряд Фибоначчи до n"""
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

class Foo:
    pass

if  __name__  ==  '__main__':
    print(a)
    fib(500)

Теперь, если запустить md.py как скрипт, то получите вывод, но при импорте файла md.py как модуля, вывода никакого не будет.

>>> import md
>>> md.fib(500)
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

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

Изменим блок кода в условии if __name__ == '__main__':, модуля md.py следующим образом:

...
...
...
if __name__ == '__main__':
    import sys
    if len(sys.argv) > 1:
        fib(int(sys.argv[1]))

Файл md.py может быть обработан как модуль с импортированной функцией fib():

>>> from md import fib
>>> fib(500)
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

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

$ python3 md.py 500
# 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
$