При запуске, интерпретатор CPython сканирует командную строку и переменную среду с целью настройки параметров выполнения скрипта.
Схемы командной строки и ее параметров других реализаций могут отличаться. Смотрите альтернативные реализации языка Python для уточнения параметров запуска конкретной реализации.
При вызове Python можно указать любую из следующих параметров:
$ python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]
Напишем и сохраним в файл test.py
небольшую программку, которую будем запускать разными способами.
#!/usr/bin/env python3
def hello(text):
print(f'Функция "{text}"')
print('Привет Мир')
if __name__ == '__main__':
hello('hello')
Самым распространенным вариантом использования, конечно, является простой вызов скрипта:
$ python3 test.py
# Привет Мир
# Функция "hello"
-m
;-i
;importlib
;runpy
;exec()
.Иногда бывает полезно сохранить вывод скрипта для последующего анализа. Вот как это сделать:
$ python3 test.py > output.txt
Эта операция сохраняет вывод скрипта в файл output.txt
, а не в стандартный системный вывод (stdout
). Этот процесс широко известен как перенаправление потока и доступен как в Windows, так и в Unix-подобных системах.
Если output.txt
не существует, он создается автоматически, если файл уже существует, то его содержимое будет заменено новым выводом.
Наконец, если необходимо накапливать вывод последовательных исполнений в конец файла output.txt
, то нужно использовать две угловые скобки >>
вместо одной:
$ python3 test.py >> output.txt
-m
.Python предлагает ряд параметров командной строки, которые можно использовать в соответствии со своими потребностями. Например, если нужно запустить модуль Python, то необходимо использовать команду python -m
<имя-модуля>.
Опция -m
ищет в sys.path
имя модуля и запускает его содержимое как __main__
:
$ python3 -m test
# Привет Мир
# Функция "hello"
Примечание: имя модуля должно быть именем объекта модуля, а не просто строкой.
-i
.Иногда необходимо в ручную протестировать некоторые функции или классы скрипта, и здесь программиста выручает интерактивный режим работы интерпретатора Python. После того как скрипт отработает, интерпретатор Python перейдет в режим командной строки. В этом режиме, например, можно вызвать любую функцию, определенную в скрипте с другими аргументами.
$ python3 -i test.py
# Привет Мир
# Функция "hello"
# здесь можно запустить любую
# функцию с другими аргументами
>>> hello('печатает слово Привет!')
# Функция "печатает слово Привет!"
В последних версиях Windows можно запускать сценарии Python, просто введя имя файла, содержащего код, в командной строке:
C:\> test.py
# Привет Мир
# Функция "hello"
Это возможно, потому что Windows использует системный реестр и ассоциацию файлов, чтобы определить, какую программу использовать для запуска определенного файла.
В Unix-подобных системах, таких как GNU/Linux, можно добиться такого поведения добавив первую строку с текстом #!/usr/bin/env python3
. Для Python это простой комментарий, а для операционной системы эта строка указывает, какую программу необходимо использовать для запуска файла.
Эта строка начинается с комбинация символов #!
, которая обычно называется "хеш-банг" или "шебанг", и указывает путь к интерпретатору.
Есть два способа указать путь к интерпретатору:
#!/usr/bin/python3
. env
операционной системы, которая находит и запускает Python путем поиска в переменной окружения PATH
: #!/usr/bin/env python3
.И наконец, чтобы выполнить скрипт в Linux, необходимо назначить ему права на выполнение.
Вот пример того, как это сделать:
# Даем права на выполнение
$ chmod +x test.py
# Запускаем скрипт, используя его имя файла
$ ./test.py
# Привет Мир
# Функция "hello"
Обратите внимание, что если скрипт не находится в текущем рабочем каталоге, то необходимо указать путь к файлу скрипта, чтобы он запустился.
Также можно запускать сценарии и модули Python из интерактивного сеанса. Этот вариант предлагает множество возможностей.
В момент импорта модуля происходит загрузка его содержимого для последующего доступа и использования. Самое интересное в этом процессе то, что на последнем этапе import
запускает код.
Когда модуль содержит только определения классов, функций, переменных и констант, то не будет видно, что код действительно выполнялся, но когда модуль включает в себя вызовы функций, методов или других инструкций, которые генерируют видимые результаты и расположенные вне сценария верхнего уровня '__main__'
, тогда станете свидетелем его исполнения.
>>> import test
# Привет Мир
# вызов функции `hello()`
>>> test.hello('запускается как test.hello()')
# Функция "запускается как test.hello()"
# выполним импорт только функции `hello()`
>>> from test import hello
>>> hello('запускается как hello()')
# Функция "запускается как hello()"
Необходимо отметить, что код, который выполняется вне сценария верхнего уровня '__main__'
- работает только один раз за сеанс. После первого импорта последующие импорты ничего не делают, даже если изменить содержимое модуля. Это связано с тем, что операции импорта являются дорогостоящими и поэтому выполняются только один раз.
importlib
.Стандартная библиотеке Python содержит модуль importlib
, который предоставляет функцию importlib.reload()
. С помощью этой функции можно заставить интерпретатор повторно импортировать модуль и, следовательно, выполнить код модуля заново.
Обратите внимание, что аргумент importlib.reload()
должен быть именем объекта модуля, а не строкой!
# пробуем импортировать еще раз
import test
# ничего не происходит
>>> import importlib
>>> importlib.reload(test)
# Привет Мир
# <module 'test' from '/home/lyzlov/test.py'>
Функция importlib.reload()
также будет полезна, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите опробовать новую версию, не выходя из интерпретатора Python.
runpy
.Стандартная библиотека включает модуль runpy
, которая имеет функцию runpy.run_module()
, позволяющая запускать модули без их предварительного импорта. Эта функция возвращает словарь глобальных переменных исполняемого модуля.
>>> import runpy
>>> runpy.run_module(mod_name='test')
# Привет Мир
# {'__name__': 'test', '__file__': ...
# ... вывод сокращен ...
# 'hello': <function hello at 0x7f3cdfea65e0>}
Запускаемый модуль ищется с использованием стандартного механизма импорта, а затем выполняется в новом пространстве имен модулей. Первым аргументом runpy.run_module()
должна быть строка с абсолютным именем выполняемого модуля без расширения .py
.
Модуль runpy
также предоставляет функцию runpy.run_path()
, которая позволит запустить модуль, указав его расположение в файловой системе:
>>> import runpy
>>> runpy.run_path(path_name='test.py')
# Привет Мир
# {'__name__': 'test', '__file__': ...
# ... вывод сокращен ...
# 'hello': <function hello at 0x7f3cdfea65e0>}
Как и runpy.run_module()
, так и runpy.run_path()
возвращает глобальный словарь исполняемого модуля.
Аргумент path_name
должен быть строкой и может ссылаться на следующее:
sys.path
, содержащей модуль __main__
(файл __main__.py
)exec()
.Встроенная функция exec()
поддерживает динамическое выполнение кода Python, тем самым предоставляет альтернативный способ запуска скриптов:
exec(open('test.py').read())
# Привет Мир
# Функция "hello"
Здесь функция open()
открывает файл test.py
, считывает его содержимое и отправляет в функцию exec()
, которая, в свою очередь, запускает код.
Приведенный выше пример немного не соответствует действительности. Это просто "ХАК", который показывает, насколько может быть Python универсальным и гибким.