Любой файл с расширением .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 $