При запуске, интерпретатор 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. В результате на экран попадёт только поток ошибок stderr (в случае их появления). Этот процесс широко известен как перенаправление потока и доступен как в Windows, так и в Unix-подобных системах. Если output.txt не существует, он создается автоматически, если файл уже существует, то его содержимое будет заменено новым выводом.
Что-бы накапливать/добавлять вывод последовательных исполнений скрипта в конец файла output.txt, то нужно использовать две угловые скобки >> вместо одной:
$ python3 test.py >> output.txt
Ну и наконец перенаправление в файл только вывода ошибок (в случае их появления). Для этого достаточно перенаправить стандартный поток ошибок, используя команду 2> (2 - это дескриптор стандартного потока ошибок). В результате на экран попадёт только то, что команда отправляет в стандартный вывод:
$ python3 test.py 2> error.txt
Если необходимо перенаправить в файл вывод всего того, что появляется в консоли при выполнения скрипта (stdout и stderr), и при этом накапливать вывод в файле, то запуск сценария должен выглядеть следующим образом:
$ python3 test.py >> output.log 2>&1 # или проще $ python3 test.py &>> output.log
Как быть, если нужно сохранить результаты работы сценария Python в отдельный файл, не смешивая данные со сведениями об ошибках? Так как потоки можно перенаправлять независимо друг от друга, то можно добавить в команду запуска сценария перенаправления стандартного потока вывода в один файл, а ошибок в другой файл:
$ python3 test.py > output.txt 2> error.txt # с добавлением результатов сценария # в `output.txt` и перезаписью `error.txt` $ python3 test.py >> output.txt 2> error.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 универсальным и гибким.