Выполнение shell команд с Python
Повторяющиеся задачи созрели для автоматизации. Разработчики и системные администраторы обычно автоматизируют рутинные задачи, такие как проверки работоспособности и резервное копирование файлов, с помощью сценариев оболочки. Однако, поскольку эти задачи становятся более сложными, сценарии оболочки могут усложняться в обслуживании.
К счастью, мы можем использовать Python вместо сценариев оболочки для автоматизации. Python предоставляет методы для запуска команд оболочки, предоставляя нам ту же функциональность, что и сценарии оболочки. Изучение того, как выполнять команды оболочки в Python, открывает нам возможность автоматизировать компьютерные задачи структурированным и масштабируемым образом.
В этой статье мы рассмотрим различные способы выполнения команд оболочки в Python и идеальную ситуацию для использования каждого метода.
Использование os.system для запуска команды
Python позволяет нам немедленно выполнить команду оболочки, которая хранится в строке, используя функцию os.system() .
Давайте начнем с создания нового файла Python с именем echo_adelle.py и введите следующее:
Первое, что мы делаем в нашем Python файле, это импортируем модуль os , который содержит функцию system , которая может выполнять команды оболочки. Следующая строка делает именно это, запускает команду echo в нашей оболочке через Python.
В вашем терминале запустите этот файл с помощью следующей команды, и вы должны увидеть соответствующий вывод:
По мере того, как команды echo выводятся в наш stdout , os.system() также возвращает код завершения команды оболочки. Код 0 означает, что он работает без проблем, а любое другое число означает ошибку.
Давайте создадим новый файл с именем cd_return_codes.py и введите следующее:
В этом сценарии мы создаем две переменные, в которых хранятся результаты выполнения команд, которые изменяют каталог на домашнюю папку и на несуществующую папку. Запустив этот файл, мы увидим:
Первая команда, которая изменяет каталог на домашний каталог, выполняется успешно. Следовательно, os.system() возвращает код ноль, который хранится в home_dir . С другой стороны, unknown_dir сохраняет код завершения неудачной команды bash, чтобы изменить каталог на несуществующую папку.
Функция os.system() выполняет команду, печатает любой вывод команды на консоль и возвращает код завершения команды. Если нам нужно более детальное управление вводом и выводом команды оболочки в Python, мы должны использовать модуль subprocess .
Выполнение команды с подпроцессом
Модуль subprocess — это рекомендуемый Python способ выполнения команд оболочки. Это дает нам гибкость для подавления вывода команд оболочки или цепочки входов и выходов различных команд вместе, в то же время обеспечивая аналогичный опыт os.system() для базовых сценариев использования.
В новом файле с именем list_subprocess.py напишите следующий код:
В первой строке мы импортируем модуль subprocess , который является частью стандартной библиотеки Python. Затем мы используем функцию subprocess.run() для выполнения команды. Также как и команда os.system() , subprocess.run() возвращает код того, что было выполнено.
Обратите внимание, что subprocess.run() принимает список строк в качестве входных данных вместо одной строки. Первым элементом списка является название команды. Остальные пункты списка — это флаги и аргументы команды.
Примечание: Как правило, вам нужно отделить аргументы , основанные на пространстве, например , ls -alh будет [«ls», «-alh»] , а ls -a -l -h , превратится в [«ls», «-a», -«l», «-h»] .
Запустите этот файл, и вывод вашей консоли будет похож на:
Теперь давайте попробуем использовать одну из более продвинутых функций subprocess.run() , а именно игнорирование вывода в stdout . В том же файле list_subprocess.py измените:
Стандартный вывод команды теперь передается на специальное устройство /dev/null , что означает, что вывод не будет отображаться на наших консолях. Запустите файл в вашей оболочке, чтобы увидеть следующий вывод:
Что если мы хотим получить результат команды? subprocess.run() поможет сделать это. Создайте новый файл с именем cat_subprocess.py , набрав следующее:
Мы используем довольно много параметров, давайте рассмотрим их:
- stdout=subprocess.PIPE говорит Python перенаправить результат выполнения команды в объект, чтобы позже его можно было прочитать вручную
- text=True возвращает stdout и в stderr виде строк. Тип возвращаемого значения по умолчанию — байты.
- input=»Hello from the other side» говорит Python добавить строку в качестве ввода в команду cat .
Запуск этого файла приводит к следующему выводу:
Мы также можем бросить Exception без проверки значения возврата. В новом файле false_subprocess.py добавьте код ниже:
В вашем терминале запустите этот файл. Вы увидите следующую ошибку:
Используя check=True , мы сообщаем Python, что нужно вызывать любые исключения, если возникает ошибка. Так как мы столкнулись с ошибкой, оператор print в последней строке не был выполнен.
Функция subprocess.run() дает нам огромную гибкость. Эта функция представляет собой упрощенную абстракцию класса subprocess.Popen , которая предоставляет дополнительные функциональные возможности, которые мы можем исследовать.
Выполнение команды с Popen
Класс subprocess.Popen предоставляет больше возможностей для разработчика при взаимодействии с оболочкой. Тем не менее, мы должны быть более точными в получении результатов и ошибок
По умолчанию subprocess.Popen не останавливает обработку программы Python, если ее команда не завершила выполнение. В новом файле с именем list_popen.py введите следующее:
Этот код эквивалентен list_subprocess.py . Он запускает команду с помощью subprocess.Popen и ожидает ее завершения, прежде чем выполнить оставшуюся часть сценария Python.
Допустим, мы не хотим ждать завершения выполнения команды оболочки, чтобы программа могла работать над другими вещами. Как узнать, когда команда оболочки закончила выполнение?
Метод poll() возвращает код завершения, если команда закончит работу, или None если он все еще выполняется. Например, если бы мы хотели проверить, завершено ли list_dir , а не ждать его, у нас была бы следующая строка кода:
Для управления вводом и выводом subprocess.Popen нам нужно использовать метод communicate() .
В новый файл с именем cat_popen.py добавьте следующий фрагмент кода:
Метод communicate() принимает аргумент input , который используется для передачи входных данных команде оболочки. Метод communicate также возвращает stdout и stderr когда они установлены.
Мы рассмотрели три способа запуска команд оболочки в Python с использованием класса subprocess.Popen . Давайте еще раз рассмотрим их характеристики, чтобы узнать, какой метод лучше всего подходит для требований проекта.
Какой из них я должен использовать?
Если вам нужно выполнить одну или несколько простых команд и вам не помешает, если их вывод поступит в консоль, вы можете использовать команду os.system() . Если вы хотите управлять вводом и выводом команды оболочки, используйте subsystem.run() . Если вы хотите выполнить команду и продолжить выполнять другую работу, пока она выполняется, используйте subprocess.Popen .
Вот таблица с некоторыми различиями в юзабилити, которые вы также можете использовать для обоснования своего решения:
1. Командная строка и среда¶
CPython интерпретатор просматривает командную строку и окружающую среду для различных параметров настройки.
Детали реализации CPython: Схемы командной строки других реализаций могут отличаться. Дополнительные ресурсы см. в разделе Альтернативные реализации .
1.1. Командная строка¶
При вызове Python можно указать любой из этих параметров:
Самый распространенный вариант использования — это, конечно, простой вызов сценария:
1.1.1. Интерфейсные опции¶
Интерфейс интерпретатор напоминает интерфейс раковины UNIX, но обеспечивает некоторый дополнительный методы invocation:
- При вызове со стандартным входом, подключенным к устройству tty, он запрашивает команды и выполняет их до тех пор, пока не будет прочитан EOF (символ конца файла, который можно создать с помощью Ctrl-D в UNIX или Ctrl-Z, Enter в Windows).
- При вызове с аргументом имени файла или с файлом в качестве стандартного ввода он считывает и выполняет сценарий из этого файла.
- При вызове с аргументом имени каталога он считывает и выполняет сценарий с соответствующим именем из этого каталога.
- При вызове с помощью -c command он выполняет оператор(ы) Python, заданные как command. Здесь command может содержать несколько инструкции, разделенных новыми строками. Ведущий пробел значителен в Python заявлениях!
- При вызове с помощью метода -m module-name данный модуль располагается на пути модуля Python и выполняется как сценарий.
В неинтерактивном режиме весь ввод анализируется перед его выполнением.
Параметр интерфейса завершает список опций, используемых интерпретатором, все последовательные аргументы заканчиваются на sys.argv — обратите внимание, что первый элемент, нижний индекс нуль ( sys.argv[0] ), является строка, отражающим источник программы.
Выполните команду Python код в command. command может быть одним или несколькими инструкции, разделенными новыми линиями, со значительным начальным пробелом, как в обычном модуле код.
Если этот параметр задан, первый элемент sys.argv будет "-c" , а текущий каталог будет добавлен к началу sys.path (что позволит импортировать модули в этот каталог как модули верхнего уровня).
Raises an auditing event cpython.run_command with argument command .
Ищите sys.path названный модуль и выполните его содержание как модуль __main__ .
Так как аргумент — имя module, вы не должны давать расширение файла ( .py ). Имя модуля должно быть действительным абсолютным именем модуля Python, но внедрение может не всегда проводить в жизнь это (например, оно может позволить вам использовать имя, которое включает дефис).
Также разрешены имена пакетов (включая пакеты пространства имен). Когда имя пакета будет поставляться вместо нормального модуля, интерпретатор выполнит <pkg>.__main__ как главный модуль. Это поведение намеренно аналогично обработке каталогов и zipfiles, которые передаются интерпретатор в качестве аргумента сценария.
Этот параметр не может быть используемый со встроенными модулями и модулями расширений, написанными на языке C, поскольку они не имеют файлов модулей Python. Однако это может все еще быть используемый для предварительно собранных модулей, даже если файл первоисточника не доступен.
Если эта опция задана, первым элементом sys.argv будет полный путь к файлу модуля (во время нахождения файла модуля первый элемент будет установлен в "-m" ). Как и в случае с опцией -c , текущий каталог будет добавлен к началу sys.path .
Выбор -I может быть используемый, чтобы управлять сценарием в изолированном режиме, где sys.path не содержит ни текущего каталога, ни справочника пакетов сайта пользователя. Все переменные среды PYTHON* также игнорируются.
Многие стандартные библиотечные модули содержат код, вызываемые при выполнении в качестве сценария. Примером может служить модуль timeit :
Raises an auditing event cpython.run_module with argument module-name .
runpy.run_module() Эквивалентные функциональные возможности, непосредственно доступные для Python кода
PEP 338 – выполнение модулей в виде сценариев
Изменено в версии 3.1: Укажите имя пакета для запуска подмодуля __main__ .
Изменено в версии 3.4: поддерживаются также пакеты пространства имен
Считывание команд со стандартного входа ( sys.stdin ). Если стандартный вход является клеммой, подразумевается -i .
Если этот параметр задан, первый элемент sys.argv будет "-" , а текущий каталог будет добавлен к началу sys.path .
Raises an auditing event cpython.run_stdin with no arguments.
Выполните Python код, содержащийся в script, который должен быть путем файловой системы (абсолютным или относительным) со ссылкой на файл Python, каталог, содержащий файл __main__.py , или zipfile, содержащий файл __main__.py .
Если этот параметр задан, первым элементом sys.argv будет имя сценария, указанное в командной строке.
Если имя сценария ссылается непосредственно на файл Python, каталог, содержащий этот файл, добавляется к началу sys.path , и файл выполняется как модуль __main__ .
Если имя сценария ссылается на каталог или zipfile, имя сценария добавляется к началу sys.path , и файл __main__.py в этом расположении выполняется как модуль __main__ .
Выбор -I может быть используемый, чтобы управлять сценарием в изолированном режиме, где sys.path не содержит ни справочника сценария, ни справочника пакетов сайта пользователя. Все переменные среды PYTHON* также игнорируются.
Raises an auditing event cpython.run_file with argument filename .
runpy.run_path() эквивалентные функциональные возможности, непосредственно доступные для Python кода
Если параметр интерфейса не задан, -i подразумевается, sys.argv[0] является пустым строка ( "" ) и текущий каталог будет добавлен к началу sys.path . Кроме того, автоматически включаются функции заполнения вкладок и редактирования журнала, если они доступны на вашей платформе (см. Конфигурация Readline ).
Изменено в версии 3.4: Автоматическое включение заполнения вкладок и редактирования журнала.
1.1.2. Универсальные опции¶
Напечатайте краткое описание всех параметров командной строки.
Распечатайте номер версии Python и выйдите. Примером вывода может быть:
При двойном вводе напечатайте дополнительную информацию о сборке, например:
Добавлено в версии 3.6: The -VV option.
1.1.3. Причие опции¶
Выдайте предупреждение при сравнении bytes или bytearray с str или bytes с int . Выдайте ошибку, если опция задана дважды ( -bb ).
Изменено в версии 3.5: Влияет на сравнение bytes с int .
Если задано, Python не будет пытаться записать файлы .pyc при импорте исходных модулей. См. также раздел PYTHONDONTWRITEBYTECODE .
Управление поведением проверки хэш-файлов .pyc . См. Инвалидация кэша байткода . Если установлено значение default , файлы кэша байт-кодов на основе отмеченных и не отмеченных хэш-кодов проверяются в соответствии с семантикой по умолчанию. Если установлено значение always , все файлы .pyc на основе хэша, если они установлены или не установлены, проверяются по соответствующему исходному файлу. Если установлено значение never , файлы .pyc на основе хэша не проверяются по соответствующим исходным файлам.
Этот параметр не влияет на семантику файлов .pyc на основе временных меток.
Включите продукцию отладки парсер (для эксперта только, в зависимости от вариантов компиляции). См. также раздел PYTHONDEBUG .
Игнорируйте все переменные среды PYTHON* , например, PYTHONPATH и PYTHONHOME , которые могут быть установлены.
Когда сценарий передается в качестве первого аргумента или используется параметр -c , после выполнения сценария или команды, даже если sys.stdin не является терминалом, следует перейти в интерактивный режим. Файл PYTHONSTARTUP не считан.
Это может быть полезно для проверки глобальных переменных или трассировки стека, когда сценарий вызывает исключение. См. также раздел PYTHONINSPECT .
Запустить Python в изолированном режиме. Это также подразумевает -E и -s. В изолированном режиме sys.path не содержит ни каталог сценария, ни каталог пакетов сайта пользователя. Все переменные среды PYTHON* также игнорируются. Дополнительные ограничения могут быть введены для предотвращения введения пользователем вредоносного код.
Добавлено в версии 3.4.
Удалите утверждение инструкции и любое код, зависящее от значения __debug__ . Увеличьте имя файла для скомпилированных ( байт-код ) файлов, добавив .opt-1 перед расширением .pyc (см. PEP 488). См. также раздел PYTHONOPTIMIZE .
Изменено в версии 3.5: Измените имена файлов .pyc согласно PEP 488.
Делайте -O , а также выбрасывайте докстринги. Увеличьте имя файла для скомпилированных ( байт-код ) файлов, добавив .opt-2 перед расширением .pyc (см. PEP 488).
Изменено в версии 3.5: Измените имена файлов .pyc согласно PEP 488.
Не отображать сообщения об авторских правах и версии даже в интерактивном режиме.
Добавлено в версии 3.2.
Включить хеш-рандомизацию. Эта опция действует только в том случае, если для переменной среды PYTHONHASHSEED установлено значение 0 , поскольку по умолчанию хеш-рандомизация включена.
В предыдущих версиях Python этот параметр включает рандомизацию хеширования, так что значения __hash__() объектов str и bytes «засолены» непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python.
Рандомизация хеширования предназначена для обеспечения защиты от отказа в обслуживании, вызванного тщательно подобранными входами, которые используют наихудшую производительность конструкции dict, сложность O(n^2). Дополнительные сведения см. в разделе http://www.ocert.org/advisories/ocert-2011-003.html.
PYTHONHASHSEED позволяет задать фиксированное значение для ключа начального значения хэша.
Изменено в версии 3.7: Этот параметр больше не игнорируется.
Добавлено в версии 3.2.3.
PEP 370 – каталог пакетов сайтов для каждого пользователя
Отключите импорт модуля site и зависимые от сайта манипуляции sys.path , который он влечет за собой. Также отключите эти манипуляции, если site явно импортирован позже (назовите site.main() , если вы хотите, чтобы они были вызваны).
Вытащите потоки stdout и stderr из буфера. Этот параметр не влияет на поток stdin.
Изменено в версии 3.7: Текстовый слой потоков stdout и stderr теперь не буферизован.
Печать сообщения при каждой инициализации модуля с указанием места (имени файла или встроенного модуля), откуда оно загружается. Дважды ( -vv ) распечатайте сообщение для каждого файла, который проверяется при поиске модуля. Также содержит информацию о очистке модуля на выходе. См. также раздел PYTHONVERBOSE .
Предупреждение контроля. Python’s механизм предупреждения по умолчанию печатает предупреждающие сообщения для sys.stderr . Типичное предупреждающее сообщение имеет следующую форму:
По умолчанию каждое предупреждение печатается один раз для каждой исходной строки, где оно происходит. Этот параметр управляет частотой печати предупреждений.
Могут быть заданы несколько вариантов -W ; если предупреждение соответствует нескольким опциям, выполняется действие для последнего параметра сопоставления. Недопустимые параметры -W игнорируются (однако при первом выводе предупреждения выводится предупреждающее сообщение о недопустимых параметрах).
Предупреждениями также можно управлять с помощью переменной среды PYTHONWARNINGS и из программы Python с помощью модуля warnings .
Простейшие настройки безоговорочно применяют определенное действие ко всем предупреждениям, выдаваемым процессом (даже к тем, которые по умолчанию игнорируются другими способами):
Имена действия могут быть сокращены, как желаемый (например, -Wi , -Wd , -Wa , -We ), и интерпретатор решит их к имени соответствующих мер.
Пропустите первую строку источника, разрешив использование не Unix-форм #!cmd . Это предназначено только для взлома DOS.
Зарезервирован для различных вариантов реализации. CPython в настоящее время определяет следующие возможные значения:
- -X faulthandler для включения faulthandler ;
- -X showrefcount , чтобы произвести полное справочное количество и количество памяти используемый блокирует, когда программа заканчивается или после каждого инструкция в интерактивном интерпретатор. Это работает только для отладочных построений.
- -X tracemalloc , чтобы начать прослеживать отчисления памяти Python, используя модуль tracemalloc . По умолчанию в трейсбэк трассировки сохраняется только самый последний кадр. Используйте -X tracemalloc=NFRAME , чтобы начать прослеживать с пределом трейсбэк структур NFRAME. Дополнительные сведения см. в разделе tracemalloc.start() .
- -X showalloccount для вывода общего количества выделенных объектов для каждого типа по завершении программы. Это только работает, когда Python был построен с определенным COUNT_ALLOCS .
- -X importtime , чтобы показать, сколько времени занимает каждый импорт. Он показывает имя модуля, совокупное время (включая вложенный импорт) и собственное время (исключая вложенный импорт). Следует отметить, что его выход может быть нарушен в многопоточном приложении. Типичное использование — python3 -X importtime -c ‘import asyncio’ . См. такж раздел PYTHONPROFILEIMPORTTIME .
- -X dev : включить «режим разработки» CPython, введя дополнительные проверки среды выполнения, которые слишком дороги для включения по умолчанию. Он не должен быть более подробным, чем значение по умолчанию, если код является правильным: новые предупреждения выдаются только при обнаружении проблемы. Эффект режима разработчика:
- Добавьте фильтр предупреждения default как -W default .
- Установите отладочные хуки на распределители памяти: см. функцию the:c:func: PyMem_SetupDebugHooks C.
- Включите модуль faulthandler для сброса Python трейсбэк в случае сбоя.
- Включите asyncio debug mode .
- Установите dev_mode атрибут sys.flags True . деструктор регистрирует исключения close() .
Это также позволяет передавать произвольные значения и извлекать их через словарь sys._xoptions .
Изменено в версии 3.2: Добавлен параметр -X .
Добавлено в версии 3.3: Опция -X faulthandler .
Добавлено в версии 3.4: Параметры -X showrefcount и -X tracemalloc .
Добавлено в версии 3.6: Опция -X showalloccount .
Добавлено в версии 3.7: Опции -X importtime , -X dev и -X utf8 .
Добавлено в версии 3.8: Опция -X pycache_prefix . Опция -X dev теперь регистрирует исключения close() в деструкторе io.IOBase .
1.1.4. Опции, которые вы не должны использовать¶
Зарезервировано для использования Jython.
1.2. Переменные окружения¶
Эти переменные среды влияют на поведение Python’s, они обрабатываются перед переключателями командной строки, отличными от -E или -I. Обычно коммутаторы командной строки переопределяют переменные среды при возникновении конфликта.
Измените расположение стандартных библиотек Python. По умолчанию библиотеки — найденный в prefix /lib/python version и exec_prefix /lib/python version , где prefix и exec_prefix — зависимые от установки справочники, оба невыполнения обязательств к /usr/local .
Когда PYTHONHOME установлен в единственный справочник, его стоимость заменяет и prefix и exec_prefix . Чтобы задать для них различные значения, установите для параметра PYTHONHOME значение prefix : exec_prefix .
Увеличьте путь поиска по умолчанию для файлов модулей. Формат совпадает с форматом PATH оболочки: одно или несколько путей каталога, разделенных os.pathsep (например, двоеточия в Unix или точка с запятой в Windows). Несуществующие каталоги автоматически игнорируются.
В дополнение к обычным каталогам, отдельные записи PYTHONPATH могут относиться к zipfiles, содержащим чистые модули Python (в исходной или скомпилированной форме). Модули расширений нельзя импортировать из zipfiles.
Путь поиска по умолчанию — инсталляционный иждивенец, но обычно начинается с prefix /lib/python version (см. PYTHONHOME выше). Он always добавляется к PYTHONPATH .
Дополнительный каталог будет вставлен в путь поиска перед PYTHONPATH , как описано выше в разделе Интерфейсные опции . Путем поиска можно управлять из программы Python в качестве переменной sys.path .
Если это имя читаемого файла, команды Python в этом файле выполняются перед отображением первого запроса в интерактивном режиме. Файл выполняется в том же пространстве имен, где выполняются интерактивные команды, чтобы объекты, определенные или импортированные в него, могли быть используемый без квалификации в интерактивном сеансе. Также в этом файле можно изменить подсказки sys.ps1 и sys.ps2 и крючок sys.__interactivehook__ .
Вызывает событие аудита cpython.run_startup с именем файла в качестве аргумента при запуске.
Если это установлено в непустой строка, это эквивалентно определению выбора -O . Если задано целое число, оно эквивалентно заданию -O несколько раз.
Если этот параметр установлен, он называет вызываемый объект с помощью нотации с пунктирным контуром. Модуль, содержащий подлежащее выкупу, будет импортирован, и затем подлежащим выкупу будет управлять внедрение по умолчанию sys.breakpointhook() , который самого называет встроенный breakpoint() . Если значение не установлено или установлено в пустую строку, оно эквивалентно значению «pdb.set_trace.» установка этого значения в <unk> «0» приводит к тому, что реализация по умолчанию <unk> не делает ничего, кроме немедленного возврата.
Добавлено в версии 3.7.
Если это установлено в непустой строка, это эквивалентно определению выбора -d . Если задано целое число, оно эквивалентно заданию -d несколько раз.
Если это установлено в непустой строка, это эквивалентно определению выбора -i .
Эта переменная может также быть изменена Python код, используя os.environ , чтобы вызвать, осматривают режим после завершения программы.
Если это установлено в непустой строка, это эквивалентно определению выбора -u .
Если это установлено в непустой строка, это эквивалентно определению выбора -v . Если задано целое число, оно эквивалентно заданию -v несколько раз.
Если этот параметр установлен, Python игнорирует регистр в import инструкции. Это работает только в Windows и OS X.
Если задано значение непустой строки, Python не будет пытаться записывать файлы .pyc при импорте исходных модулей. Это эквивалентно заданию параметра -B .
Если это будет установлено, то Python напишет файлы .pyc в дереве каталогов зеркала на этом пути, вместо в каталогах __pycache__ в исходном дереве. Это эквивалентно заданию параметра -X pycache_prefix=PATH .
Добавлено в версии 3.8.
Если эта переменная не установлена или установлена в random , случайная стоимость — используемый, чтобы отобрать мешанины объектов байтов и ул.
Если для параметра PYTHONHASHSEED установлено целое значение, он используемый как фиксированное начальное значение для генерации хеша () типов, охватываемых рандомизацией хеша.
Его цель — разрешить повторяемое хеширование, например, для selftests для самого интерпретатор, или разрешить кластеру процессов python совместно использовать значения хеширования.
Целое число должно быть десятичным числом в диапазоне [0, 4294967295]. Указание значения 0 отключит рандомизацию хеширования.
Добавлено в версии 3.2.3.
Если этот параметр установлен перед запуском интерпретатора, он переопределяет кодировка используемый для stdin/stdout/stderr в синтаксисе encodingname:errorhandler . И encodingname , и :errorhandler части являются необязательными и имеют то же значение, что и в str.encode() .
Для stderr :errorhandler часть игнорируется; обработчик всегда будет ‘backslashreplace’ .
Изменено в версии 3.4: Теперь encodingname часть является необязательной.
Изменено в версии 3.6: В Windows кодировка, указанная этой переменной, игнорируется для интерактивных буферов консоли, если не указано также PYTHONLEGACYWINDOWSSTDIO . На файлы и пайпы, перенаправленные через стандартные потоки, это не влияет.
Если это будет установлено, то Python не добавит user site-packages directory к sys.path .
PEP 370 – каталог пакетов сайтов для каждого пользователя
Определяет user base directory , который является используемый для вычисления пути user site-packages directory и Пути установки Distutils для python setup.py install —user .
PEP 370 – каталог пакетов сайтов для каждого пользователя
Если эта переменная окружения будет установлена, то sys.argv[0] будет установлен в свою стоимость вместо стоимости, прошел через время выполнения C. Работает только на Mac OS X.
Это эквивалентно параметру -W . Если задано значение «строка, разделенная запятыми», это эквивалентно заданию -W несколько раз, причем фильтры в дальнейшем в списке имеют приоритет над фильтрами ранее в списке.
Простейшие настройки безоговорочно применяют определенное действие ко всем предупреждениям, выдаваемым процессом (даже к тем, которые по умолчанию игнорируются другими способами):
Если эта переменная окружения установлена в непустую последовательность, faulthandler.enable() называют при запуске: установить обработчик для SIGSEGV , SIGFPE , SIGABRT , SIGBUS и SIGILL сигнализируют, чтобы свалить Python трейсбэк. Это эквивалентно параметру -X faulthandler .
Добавлено в версии 3.3.
Если эта переменная окружения установлена в непустую последовательность, начните прослеживать отчисления памяти Python, используя модуль tracemalloc . Значение переменной — это максимальное количество кадров, хранящихся в трейсбэк трассировки. Например, PYTHONTRACEMALLOC=1 хранит только самый последний кадр. Дополнительные сведения см. в разделе tracemalloc.start() .
Добавлено в версии 3.4.
Если для этой переменной среды установлена непустая строка, Python покажет, сколько времени занимает каждый импорт. Это в точности эквивалентно установке -X importtime в командной строке.
Добавлено в версии 3.7.
Если эта переменная окружения установлена в непустую последовательность, включите debug mode модуля asyncio .
Добавлено в версии 3.4.
Установите распределителей памяти Python и/или установите крюки отладки.
Задайте семейство распределителей памяти используемый Python:
- default : использовать default memory allocators .
- malloc : использовать функцию malloc() библиотеки C для всех доменов ( PYMEM_DOMAIN_RAW ,: c:data: PYMEM_DOMAIN_MEM ,:c:data: PYMEM_DOMAIN_OBJ ).
- pymalloc : используйте домены pymalloc allocatorPYMEM_DOMAIN_MEM и PYMEM_DOMAIN_OBJ и используйте функцию malloc() для PYMEM_DOMAIN_RAW домена.
Установите отладочные хуки:
- debug : установить отладочные хуки поверх default memory allocators .
- malloc_debug : то же, что и malloc , но также установите отладочные хуки.
- pymalloc_debug : то же, что и pymalloc , но также установите отладочные хуки.
Посмотрите default memory allocators , и PyMem_SetupDebugHooks() функционировать (установите отладку, зацепляет распределителей памяти Python).
Изменено в версии 3.7: Добавлен распределитель "default" .
Добавлено в версии 3.6.
Если установлено в непустую последовательность, Python напечатает статистику pymalloc memory allocator каждый раз, когда новая арена объекта pymalloc создана и на закрытии.
Эта переменная проигнорирована, если переменная окружения PYTHONMALLOC — используемый, чтобы вынудить the:c:func: malloc лицо, ведающее распределением библиотеки C, или если Python настроен без поддержки pymalloc .
Изменено в версии 3.6: Эта переменная может теперь также быть используемый на Python, собранном в режиме выпуска. Теперь он не действует, если задано пустое строка.
Если установлено значение непустой строки, то в режиме файловой системы кодировка и ошибок по умолчанию будут возвращены значения «mbcs» и «replace» соответственно до 3.6. В противном случае новые значения по умолчанию «utf-8» и «суррогатепас» являются используемый.
Это также может быть включено во время выполнения с помощью sys._enablelegacywindowsfsencoding() .
Добавлено в версии 3.6: Дополнительные сведения см. в разделе PEP 529.
Если установлено значение непустой строки, не использует новое устройство чтения и записи консоли. Это означает, что знаки Unicode будут кодированный согласно активному пульту страница код, вместо того, чтобы использовать utf-8.
Эта переменная игнорируется, если стандартные потоки перенаправляются (в файлы или каналы), а не ссылаются на буферы консоли.
Добавлено в версии 3.6.
Если установлено в стоимость 0 , вызывает главное заявление командной строки Python пропустить принуждение наследия, основанный на ASCII C и места действия POSIX к более способному UTF-8 основывали альтернативу.
Если эта переменная — набор not (или установлен в стоимость кроме 0 ),, место действия LC_ALL отвергает переменную окружения, также не установлен, и текущее место действия, о котором сообщают для категории LC_CTYPE , является или дефолтом место действия C или иначе явно основанным на ASCII местом действия POSIX , тогда Python CLI попытается настроить следующие места действия для категории LC_CTYPE в заказе, перечисленном прежде, чем загрузить интерпретатор runtime:
- C.UTF-8
- C.utf8
- UTF-8
Если одна из этих категорий языкового стандарта успешно задана, то переменная среды LC_CTYPE также будет установлена соответствующим образом в текущей среде процесса до инициализации среды выполнения Python. Это гарантирует, что в дополнение к просмотру как самого интерпретатор, так и других языковых компонентов, выполняющихся в одном и том же процессе. (такие как библиотека GNU readline ), обновленная настройка также замечена в подпроцессах (независимо от того, запущены ли эти процессы интерпретатором Python), а также в операциях, которые подвергают сомнению окружающую среду, а не ток C место действия (такое как Python’s владеют locale.getdefaultlocale() ).
Настройка одного из этих языков (явного или неявного принуждения языкового стандарта) автоматически включает surrogateescape error handler для sys.stdin и sys.stdout ( sys.stderr продолжает использовать backslashreplace , как и в любой другой языковой стандарт). Это поведение обработки потока может быть отвергнуто, используя PYTHONIOENCODING , как обычно.
Для отладки целей, устанавливая PYTHONCOERCECLOCALE=warn заставит Python испускать предупреждающие сообщения на stderr , если или принуждение места действия активирует, или иначе если место действия, что would вызвали принуждение, все еще активно, когда время выполнения Python инициализировано.
Также обратите внимание, что, даже когда принуждение места действия отключено, или когда оно не находит подходящее целевое место действия, PYTHONUTF8 все еще активирует по умолчанию в наследии основанные на ASCII места действия. Обе опции должны быть отключены, чтобы вынудить интерпретатор использовать ASCII вместо UTF-8 для системных интерфейсов.
Добавлено в версии 3.7: Дополнительные сведения см. в разделе PEP 538.
Если для этой переменной среды установлена непустая строка, включите CPython «режим разработки». См. параметр -X dev .
Добавлено в версии 3.7.
Если установлено в 1 , включает режим переводчика UTF-8, где UTF-8 — используемый как текст кодировка для системных интерфейсов, независимо от текущей настройки места действия.
Это означает что:
-
возвращает ‘UTF-8’ (языковой стандарт кодировка игнорируется). возвращает ‘UTF-8’ (языковой стандарт кодировка игнорируется, а параметр do_setlocale функции не действует). , sys.stdout и sys.stderr все используют UTF-8 в качестве кодировки текста, с включенными surrogateescape error handler для sys.stdin и sys.stdout ( sys.stderr продолжает использовать backslashreplace , как и в режиме с учетом языкового стандарта по умолчанию)
В результате изменений в этих API более низкого уровня другие API более высокого уровня также демонстрируют другое поведение по умолчанию:
- Аргументы командной строки, переменные среды и имена файлов декодируются в текст с помощью UTF-8 кодировка. и os.fsencode() используйте UTF-8 Кодировка. , io.open() и codecs.open() по умолчанию используют UTF-8 кодировка. Тем не менее, они по-прежнему используют строгий обработчик ошибок по умолчанию, так что попытка открыть двоичный файл в текстовом режиме, вероятно, вызовет исключение, а не создаст бредовые данные.
Обратите внимание, что стандартные настройки потока в режиме UTF-8 могут быть переопределены параметром PYTHONIOENCODING (точно так же, как они могут находиться в режиме с учетом языкового стандарта по умолчанию).
Если установлено значение 0 , интерпретатор работает в стандартном режиме с учетом языковых стандартов.
Установка других непустых строка приводит к ошибке во время инициализации интерпретатор.
Если эта переменная окружения не установлена вообще, то дефолты интерпретатор к использованию текущих параметров настройки места действия, unless, текущее место действия идентифицировано как наследие основанное на ASCII место действия (как описано для PYTHONCOERCECLOCALE ), и принуждение места действия, или отключены или терпят неудачу. В таких устаревших местах действия интерпретатор не выполнит своих обязательств к предоставлению возможности режима UTF-8, если явно не проинструктировано не сделать так.
Также доступна в качестве опции -X utf8 .
Добавлено в версии 3.7: Дополнительные сведения см. в разделе PEP 540.
1.2.1. Переменные режима отладки¶
Установка этих переменных влияет только на отладочную сборку Python.
Если этот параметр установлен, Python будет печатать данные отладки многопоточности.
Python потребности, настроенные с —with-pydebug , строят выбор.
Если установлено, Python свалит объекты и справочное количество, все еще живое после закрытия интерпретатор.
Нужно, чтобы Python был настроен с помощью —with-trace-refs опция сборки.
1. Командная строка и окружение¶
Интерпретатор CPython просматривает командную строку и окружение для различных параметров настройки.
Детали реализации CPython: Схемы командной строки других реализаций могут отличаться. Дополнительные ресурсы см. в разделе Альтернативные реализации .
1.1. Командная строка¶
При вызове Python можно указать любой из этих параметров:
Самый распространенный вариант использования — это, конечно, простой вызов сценария:
1.1.1. Интерфейсные опции¶
Интерфейс интерпретатора напоминает шелл интерфейс UNIX, но предоставляет некоторые дополнительный методы вызова:
- При вызове со стандартным входом, подключенным к устройству tty, он запрашивает команды и выполняет их до тех пор, пока не будет прочитан EOF (символ конца файла, который можно создать с помощью Ctrl-D в UNIX или Ctrl-Z, Enter в Windows).
- При вызове с аргументом имени файла или с файлом в качестве стандартного ввода он считывает и выполняет сценарий из этого файла.
- При вызове с аргументом имени каталога он считывает и выполняет сценарий с соответствующим именем из этого каталога.
- При вызове с помощью -c command он выполняет оператор(ы) Python, заданные как command. Здесь command может содержать несколько операторов, разделенных новыми строками. Ведущий пробел важен в Python операторах!
- При вызове с -m module-name модуль выполняется как сценарий, при условии что он доступен.
В неинтерактивном режиме весь ввод анализируется перед его выполнением.
Параметр интерфейса завершает список опций, используемых интерпретатором, все последовательные аргументы заканчиваются на sys.argv . Обратите внимание, что первый элемент — нижний нулевой индекс ( sys.argv[0] ), является строкой, отражающей источник программы.
Выполнить команду Python кода в command. command может быть одним или несколькими операторами, разделенными новыми строками, с важным начальным пробелом, как в обычном модуле кода.
Если параметр задан, первый элемент sys.argv будет «-c» , а текущий каталог будет добавлен к началу sys.path (что позволит импортировать модули в этот каталог как модули верхнего уровня).
Поднимает событие аудита cpython.run_command с аргументом command .
Ищет в sys.path вызываемый модуль и выполняет его содержание как модуль __main__ .
Т. к. аргумент — имя module, вы не должны передавать расширение файла ( .py ). Имя модуля должно быть действительным абсолютным именем модуля Python, но реализация может не всегда воплотить это в жизнь (например, она может позволить вам использовать имя, которое включает дефис).
Также разрешены имена пакетов (включая пакеты пространства имён). Когда имя пакета будет поставляться вместо нормального модуля, интерпретатор выполнит <pkg>.__main__ как главный модуль. Это поведение намеренно аналогично обработке каталогов и zipfiles, которые передаются интерпретатору в качестве аргумента сценария.
Этот параметр не может использоваться со встроенными модулями и модулями расширений, написанными на языке C, поскольку они не имеют файлов модулей Python. Однако это может использоваться для предварительно собранных модулей, даже если файл первоисточника не доступен.
Если эта опция задана, первым элементом sys.argv будет полный путь к файлу модуля (во время нахождения файла модуля первый элемент будет установлен в «-m» ). Как и в случае с опцией -c , текущий каталог будет добавлен к началу sys.path .
Выбор -I может использоваться, чтобы управлять сценарием в изолированном режиме, где sys.path не содержит ни текущего каталога, ни справочника site-packages пользователя. Все переменные среды PYTHON* также игнорируются.
Многие стандартные библиотечные модули содержат код, вызываемый при выполнении в качестве сценария. Примером может служить модуль timeit :
Поднимает событие аудита cpython.run_module с аргументом module-name .
runpy.run_module() Эквивалентные функциональные возможности, непосредственно доступные для Python кода
PEP 338 – выполнение модулей в виде сценариев
Изменено в версии 3.1: Укажите имя пакета для запуска подмодуля __main__ .
Изменено в версии 3.4: Поддерживаются также пакеты пространства имён
Считывание команд со стандартного ввода ( sys.stdin ). Если стандартный ввод является терминалом, то подразумевается -i .
Если этот параметр задан, первый элемент sys.argv будет «-» , а текущий каталог будет добавлен к началу sys.path .
Поднимает событие аудита cpython.run_stdin без аргументов.
Выполнить Python код, содержащийся в script, который должен быть путём файловой системы (абсолютным или относительным) со ссылкой на файл Python, каталог, содержащий файл __main__.py , или zipfile, содержащий файл __main__.py .
Если этот параметр задан, первым элементом sys.argv будет имя сценария, указанное в командной строке.
Если имя сценария ссылается непосредственно на файл Python, каталог, содержащий этот файл, добавляется к началу sys.path , и файл выполняется как модуль __main__ .
Если имя сценария ссылается на каталог или zipfile, имя сценария добавляется к началу sys.path , и файл __main__.py в этом расположении выполняется как модуль __main__ .
Опция -I может использоваться, чтобы управлять сценарием в изолированном режиме, где sys.path не содержит ни каталогов сценарных, ни каталога site-packages пользователя. Все переменные среды PYTHON* также игнорируются.
Поднимает событие аудита cpython.run_file с аргументом filename .
runpy.run_path() эквивалентные функциональные возможности, непосредственно доступные для Python кода
Если параметр интерфейса не задан, подразумевается -i , sys.argv[0] является пустой строкой ( «» ) и текущий каталог будет добавлен к началу sys.path . Кроме того, автоматически включаются функции автодополнения табов и редактирования истории, если они доступны на вашей платформе (см. Конфигурация Readline ).
Изменено в версии 3.4: Автоматическое включение автодополнения табов и редактирования истории.
1.1.2. Универсальные опции¶
Напечатать краткое описание всех параметров командной строки.
Напечатать номер версии Python и выйти. Примером вывода может быть:
При двойном вводе напечатает дополнительную информацию о сборке, например:
Добавлено в версии 3.6: Опция -VV .
1.1.3. Прочие опции¶
Выдать предупреждение при сравнении bytes или bytearray с str или bytes с int . Выдать ошибку, если опция задана дважды ( -bb ).
Изменено в версии 3.5: Влияет на сравнение bytes с int .
Если задано, Python не будет пытаться записать файлы .pyc при импорте исходных модулей. См. также раздел PYTHONDONTWRITEBYTECODE .
Управляет поведением проверки файлов .pyc на основе хэшей. См. инвалидацию кэша байткода . Если установлено значение default , проверенные и непроверенные файлы кэша байт-кода на основе хеша проверяются в соответствии с их семантикой по умолчанию. Если установлено значение always , все файлы .pyc на основе хэшей, независимо от того, отмечены они или нет, проверяются на соответствие их соответствующему исходному файлу. Если задано значение never , файлы .pyc на основе хэшей не проверяются на соответствие их соответствующим исходным файлам.
Этот параметр не влияет на семантику файлов .pyc на основе временных меток.
Включить отладочный вывод парсера (только для эксперта, в зависимости от вариантов компиляции). См. также раздел PYTHONDEBUG .
Игнорировать все переменные среды PYTHON* , например, PYTHONPATH и PYTHONHOME , которые могут быть установлены.
Когда сценарий передаётся в качестве первого аргумента или используется параметр -c , после выполнения сценария или команды, даже если sys.stdin не является терминалом, следует перейти в интерактивный режим. Файл PYTHONSTARTUP не считан.
Может быть полезно для проверки глобальных переменных или трассировки стека, когда сценарий вызывает исключение. См. также раздел PYTHONINSPECT .
Запустить Python в изолированном режиме. Также подразумевает -E и -s. В изолированном режиме sys.path не содержит ни каталог сценария, ни каталог site-packages пользователя. Все переменные среды PYTHON* также игнорируются. Дополнительные ограничения могут быть введены для предотвращения ввода пользователем вредоносного кода.
Добавлено в версии 3.4.
Удалить операторы assert и любой код, обусловленный значением __debug__ . Увеличить имя файла для скомпилированных ( байт-код ) файлов, добавив .opt-1 перед расширением .pyc (см. PEP 488). См. также PYTHONOPTIMIZE .
Изменено в версии 3.5: Изменены имена файлов .pyc согласно PEP 488.
Сделать -O , а также отбросить строки документации. Увеличить имя файла для скомпилированных ( байт-код ) файлов, добавив .opt-2 перед расширением .pyc (см. PEP 488).
Изменено в версии 3.5: Изменены имена файлов .pyc согласно PEP 488.
Не отображать сообщения об авторских правах и версии даже в интерактивном режиме.
Добавлено в версии 3.2.
Включить хеш-рандомизацию. Эта опция действует только в том случае, если для переменной среды PYTHONHASHSEED установлено значение 0 , поскольку по умолчанию хеш-рандомизация включена.
В предыдущих версиях Python этот параметр включает рандомизацию хеширования, так что значения __hash__() объектов str и bytes «засолены» непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python.
Рандомизация хеширования предназначена для обеспечения защиты от отказа в обслуживании, вызванного тщательно подобранными вводами, которые используют наихудшую производительность конструкции dict, сложность O(n^2). Дополнительные сведения см. на сайте.
PYTHONHASHSEED позволяет вам установить фиксированное значение для секретного хеш-кода.
Изменено в версии 3.7: Параметр больше не игнорируется.
Добавлено в версии 3.2.3.
PEP 370 – каталог site-packages для каждого пользователя
Отключить импорт модуля site и связанные с ним манипуляции с sys.path , зависящие от сайта. Также отключить эти манипуляции, если site будет явно импортирован позже (вызовите site.main() , если вам нужно чтобы они запускались).
Принудительно отключить буферизацию потоков stdout и stderr. Этот параметр не влияет на поток stdin.
Изменено в версии 3.7: Текстовый слой потоков stdout и stderr теперь не буферизован.
Печать сообщения при каждой инициализации модуля с указанием места (имени файла или встроенного модуля), откуда оно загружается. Дважды ( -vv ) распечатает сообщение для каждого файла, который проверяется при поиске модуля. Также содержит информацию о очистке модуля на выходе. См. также раздел PYTHONVERBOSE .
Управление предупреждением. Python механизм предупреждения по умолчанию печатает предупреждающие сообщения в sys.stderr . У типичного предупреждающего сообщения есть следующая форма:
По умолчанию каждое предупреждение печатается один раз для каждой исходной строки, где оно происходит. Этот параметр управляет частотой печати предупреждений.
Может быть указано несколько опций -W ; когда предупреждение соответствует более чем одному параметру, выполняется действие для последнего совпадающего параметра. Недопустимые параметры -W игнорируются (хотя при первом предупреждении печатается предупреждающее сообщение о недопустимых параметрах).
Предупреждениями также можно управлять с помощью переменной среды PYTHONWARNINGS и из программы Python с помощью модуля warnings .
В простейших настройках определенное действие безоговорочно применяется ко всем предупреждениям, выдаваемым процессом (даже к тем, которые по умолчанию игнорируются):
Имена действий могут быть сокращены по желанию (например, -Wi , -Wd , -Wa , -We ), и интерпретатор преобразует их в соответствующее имя действия.
Пропустить первую строку исходника, разрешив использование не Unix-форм #!cmd . Это предназначено только для хака DOS.
Зарезервирован для различных опций реализации. CPython в настоящее время определяет следующие возможные значения:
- -X faulthandler для включения faulthandler ;
- -X showrefcount для вывода общего счетчика ссылок и количества использованных блоков памяти при завершении программы или после каждого оператора в интерактивном интерпретаторе. Работает только в отладочных сборках.
- -X tracemalloc«для начаа отслеживание распределения памяти Python с помощью модуля :mod:`tracemalloc`. По умолчанию в traceback трассировки сохраняется только самый последний фрейм. Используйте «-X tracemalloc=NFRAME , чтобы начать трассировку с пределом трассировки фреймов NFRAME. См. tracemalloc.start() для получения дополнительной информации.
- -X showalloccount для вывода общего количества выделенных объектов для каждого типа по завершении программы. Работает только, когда Python был собран с определенным COUNT_ALLOCS .
- -X importtime , чтобы показать, сколько времени занимает каждый импорт. Он показывает имя модуля, совокупное время (включая вложенный импорт) и собственное время (исключая вложенный импорт). Следует отметить, что его вывод может быть нарушен в многопоточном приложении. Типичное использование — python3 -X importtime -c ‘import asyncio’ . См. такж раздел PYTHONPROFILEIMPORTTIME .
- -X dev : включить «режим разработки» CPython, введя дополнительные проверки среды выполнения, которые слишком дороги для включения по умолчанию. Он не должен быть более подробным, чем значение по умолчанию, если код является правильным: новые предупреждения выдаются только при обнаружении проблемы. Эффект от режима разработчика:
- Добавьте фильтр предупреждения default как -W default .
- Установить отладочные хуки на распределители памяти: см. функцию PyMem_SetupDebugHooks() C.
- Включить модуль faulthandler для сброса Python трейсбэка в случае сбоя.
- Включить asyncio режим отладки .
- Установить dev_mode атрибут sys.flags True . деструктор регистрирует исключения close() .
Также позволяет передавать произвольные значения и извлекать их через словарь sys._xoptions .
Изменено в версии 3.2: Добавлен параметр -X .
Добавлено в версии 3.3: Опция -X faulthandler .
Добавлено в версии 3.4: Параметры -X showrefcount и -X tracemalloc .
Добавлено в версии 3.6: Опция -X showalloccount .
Добавлено в версии 3.7: Опции -X importtime , -X dev и -X utf8 .
Добавлено в версии 3.8: Опция -X pycache_prefix . Опция -X dev теперь регистрирует исключения close() в деструкторе io.IOBase .
1.1.4. Опции, которые вы не должны использовать¶
Зарезервировано для использования Jython.
1.2. Переменные окружения¶
Переменные среды влияют на поведение Python, они обрабатываются перед переключателями командной строки, отличными от -E или -I. Обычно переключатели командной строки переопределяют переменные среды в случае конфликта.
Изменить расположение стандартных библиотек Python. По умолчанию библиотеки ищутся в prefix /lib/python version и exec_prefix /lib/python version , где prefix и exec_prefix — это каталоги, зависящие от установки, оба по умолчанию — /usr/local .
Если для PYTHONHOME задан один каталог, его значение заменяет как prefix , так и exec_prefix . Чтобы указать для них разные значения, установить PYTHONHOME на prefix : exec_prefix .
Увеличить путь поиска по умолчанию для файлов модулей. Формат совпадает с форматом PATH оболочки: одно или несколько путей каталога, разделенных os.pathsep (например, двоеточия в Unix или точка с запятой в Windows). Несуществующие каталоги автоматически игнорируются.
В дополнение к обычным каталогам, отдельные записи PYTHONPATH могут относиться к zip-файлам, содержащим чистые модули Python (в исходной или скомпилированной форме). Модули расширений нельзя импортировать из zip-файлов.
Путь поиска по умолчанию зависит от установки, но обычно начинается с prefix /lib/python version (см. PYTHONHOME выше). Он всегда добавляется к PYTHONPATH .
Дополнительный каталог будет вставлен в путь поиска перед PYTHONPATH , как описано выше в разделе Интерфейсные опции . Путь поиска можно изменить из программы Python с помощью переменной sys.path .
Если это имя читаемого файла, команды Python в этом файле выполняются до отображения первого приглашения в интерактивном режиме. Файл выполняется в том же пространстве имён, в котором выполняются интерактивные команды, так что определенные или импортированные в нём объекты могут использоваться без квалификации в интерактивном сеансе. Вы также можете изменить подсказки sys.ps1 и sys.ps2 и хук sys.__interactivehook__ в этом файле.
Вызывает событие аудита cpython.run_startup с именем файла в качестве аргумента при запуске.
Если задана непустая строка, это эквивалентно указанию параметра -O . Если установлено целое число, это эквивалентно многократному указанию -O .
Если установлена, она именует вызываемый объект, используя нотацию пути с точками. Модуль, содержащий вызываемый объект, будет импортирован, а затем вызываемый объект будет запущен реализацией по умолчанию sys.breakpointhook() , которая сама вызывается встроенным breakpoint() . Если не задана или установлена пустая строка, она эквивалентен значению «pdb.set_trace». Установка значения в строку «0» приводит к тому, что реализация по умолчанию sys.breakpointhook() ничего не делает, кроме немедленного возврата.
Добавлено в версии 3.7.
Если для неё задана непустая строка, это эквивалентно указанию параметра -d . Если установлено целое число, это эквивалентно многократному указанию -d .
Если установлена в непустую строку, это эквивалентно определению опции -i .
Эта переменная также может быть изменена кодом Python с использованием os.environ для принудительного режима проверки при завершении программы.
Если для неё задана непустая строка, это эквивалентно указанию параметра -u .
Если для неё задана непустая строка, это эквивалентно указанию параметра -v . Если установлено целое число, это эквивалентно многократному указанию -v .
Если установлена, Python игнорирует регистр в операторах import . Это работает только в Windows и OS X.
Если для этого параметра установлена непустая строка, Python не будет пытаться записывать файлы .pyc при импорте исходных модулей. Это эквивалентно указанию параметра -B .
Если установлено, Python будет записывать файлы .pyc в зеркальном дереве каталогов по этому пути, а не в каталогах __pycache__ в исходном дереве. Это эквивалентно указанию опции -X pycache_prefix=PATH .
Добавлено в версии 3.8.
Если переменная не установлена или содержит значение random , для заполнения хэшей объектов str и bytes используется случайное значение.
Если для PYTHONHASHSEED задано целочисленное значение, оно используется в качестве фиксированного начального числа для генерации hash() типов, охватываемых рандомизацией хэша.
Её цель — разрешить повторяемое хеширование, например, для самотестирования самого интерпретатора, или позволить кластеру процессов Python совместно использовать хеш-значения.
Целое число должно быть десятичным числом в диапазоне [0,4294967295]. Указание значения 0 отключит рандомизацию хэша.
Добавлено в версии 3.2.3.
Если она установлена до запуска интерпретатора, то переопределяет кодировку, используемую в stdin/stdout/stderr, в синтаксисе encodingname:errorhandler . И encodingname , и :errorhandler не являются обязательными и содержат то же значение, что и str.encode() .
Для stderr часть :errorhandler игнорируется; обработчик всегда будет ‘backslashreplace’ .
Изменено в версии 3.4: Часть encodingname теперь не является обязательной.
Изменено в версии 3.6: Кодировка в Windows, указанная этой переменной, игнорируется для буферов интерактивной консоли, если также не указана PYTHONLEGACYWINDOWSSTDIO . Файлы и каналы, перенаправленные через стандартные потоки, не затрагиваются.
PEP 370 — каталог site-packages для каждого пользователя
PEP 370 — каталог site-packages для каждого пользователя
Если переменная среды установлена, для sys.argv[0] будет установлено её значение вместо значения, полученного через среду выполнения C. Работает только в Mac OS X.
Эквивалент опции -W . Если задана строка, разделенная запятыми, это эквивалентно многократному указанию -W , при этом фильтры, расположенные позже в списке, приоритетнее над фильтрами ранее в списке.
В простейших настройках определенное действие безоговорочно применяется ко всем предупреждениям, выдаваемым процессом (даже к тем, которые по умолчанию игнорируются):
Если для этой переменной среды задана непустая строка, при запуске вызывается faulthandler.enable() : установить обработчик для сигналов SIGSEGV , SIGFPE , SIGABRT , SIGBUS и SIGILL для дампа трассировки Python. Это эквивалентно опции -X faulthandler .
Добавлено в версии 3.3.
Если для этой переменной среды задана непустая строка, начинать отслеживать выделение памяти Python с помощью модуля tracemalloc . Значение переменной — это максимальное количество фреймов, сохраняемых в обратной трассировке trace. Например, PYTHONTRACEMALLOC=1 хранит только самый последний фрейм. См. tracemalloc.start() для получения дополнительной информации.
Добавлено в версии 3.4.
Если для переменной среды задана непустая строка, Python покажет, сколько времени занимает каждый импорт. Это в точности эквивалентно настройке -X importtime в командной строке.
Добавлено в версии 3.7.
Если для этой переменной среды задана непустая строка, включить режим отладки модуля asyncio .
Добавлено в версии 3.4.
Установить распределители памяти Python и/или установить отладочные хуки.
Установить семейство распределителей памяти, используемых Python:
- default : использовать распределители памяти по умолчанию .
- malloc : использовать функцию malloc() библиотеки C для всех доменов ( PYMEM_DOMAIN_RAW , PYMEM_DOMAIN_MEM , PYMEM_DOMAIN_OBJ ).
- pymalloc : использовать pymalloc распределитель для доменов PYMEM_DOMAIN_MEM и PYMEM_DOMAIN_OBJ и использовать функцию malloc() для домена PYMEM_DOMAIN_RAW .
Установить отладочные хуки:
- debug : установить хуки отладки поверх распределителей памяти по умолчанию .
- malloc_debug : то же, что и malloc , но с установкой отладочных хуков.
- pymalloc_debug : то же, что и pymalloc , но с установкой отладочных хуков.
См. распределителей памяти по умолчанию и функцию PyMem_SetupDebugHooks() (установить отладочные хуки на распределителях памяти Python).
Изменено в версии 3.7: Добавлен распределитель «default» .
Добавлено в версии 3.6.
Если установлена непустая строка, Python будет печатать статистику pymalloc распределителя памяти каждый раз, когда создаётся новая объектная арена pymalloc, а также при завершении работы.
Эта переменная игнорируется, если переменная среды PYTHONMALLOC используется для принудительного использования распределителя malloc() библиотеки C или если Python настроен без поддержки pymalloc .
Изменено в версии 3.6: Переменную теперь также можно использовать в Python, скомпилированном в режиме релиза. Теперь она не действует, если определена пустой строкой.
Если задана непустая строка, кодировка файловой системы по умолчанию и режим ошибок вернутся к своим значениям до 3.6 «mbcs» и «replace» соответственно. В противном случае используются новые значения по умолчанию «utf-8» и «surrogatepass».
Также можно включить во время выполнения с sys._enablelegacywindowsfsencoding() .
Добавлено в версии 3.6: См. PEP 529 для получения более подробной информации.
Если задана непустая строка, новые средства чтения и записи консоли не используются. Это означает, что Юникод символы будут кодироваться в соответствии с активной кодовой страницей консоли, а не с использованием utf-8.
Эта переменная игнорируется, если стандартные потоки перенаправляются (в файлы или каналы), а не ссылаются на буферы консоли.
Добавлено в версии 3.6.
Если установлено значение 0 , основное приложение командной строки Python пропускает приведение устаревших локалей C и POSIX на основе ASCII к более функциональной альтернативе на основе UTF-8.
Если эта переменная не установлена (или ей присвоено значение, отличное от 0 ), переменная среды переопределения локали LC_ALL также не устанавливается, а текущая локаль, указанная для категории LC_CTYPE , является либо локалью по умолчанию C , либо явно ASCII-основанной локали POSIX , то Python CLI попытается настроить следующие локали для категории LC_CTYPE в порядке, указанном перед загрузкой среды выполнения интерпретатора:
- C.UTF-8
- C.utf8
- UTF-8
Если установка одной из этих категорий локали прошла успешно, то переменная среды LC_CTYPE также будет соответственно установлена в текущей среде процесса перед инициализацией среды выполнения Python. Это гарантирует, что обновленный параметр будет виден как самому интерпретатору, так и другим компонентам, зависящим от локали, работающим в одном процессе (например, библиотеке GNU readline ), и в подпроцессах (независимо от того, являются ли эти процессы запущенными интерпретатором Python или нет), а также в операциях, которые запрашивают среду, а не текущую локаль C (например, собственная Python locale.getdefaultlocale() ).
Настройка одной из этих локалей (явно или через указанное выше неявное принуждение языковых стандартов) автоматически включает surrogateescape обработчик ошибки для sys.stdin и sys.stdout ( sys.stderr продолжает использовать backslashreplace , как и в любой другой локали). Это поведение обработки потока может быть изменено, как обычно, с помощью PYTHONIOENCODING .
Для целей отладки установка PYTHONCOERCECLOCALE=warn приведёт к тому, что Python будет выдавать предупреждающие сообщения на stderr , если либо активируется принуждение локали, либо если языковой стандарт, который мог бы вызвать приведение, всё ещё активен при инициализации среды выполнения Python.
Также обратите внимание, что даже если принуждение локали отключено или не удается найти подходящую целевую локаль, PYTHONUTF8 по-прежнему будет активироваться по умолчанию в устаревших языковых стандартах на основе ASCII. Обе функции должны быть отключены, чтобы интерпретатор использовал ASCII вместо UTF-8 для системных интерфейсов.
Добавлено в версии 3.7: См. PEP 538 для получения более подробной информации.
Если для этой переменной среды задана непустая строка, включается «режим разработки» CPython. См. опцию -X dev .
Добавлено в версии 3.7.
Если установлено значение 1 , включает режим интерпретатора UTF-8, где UTF-8 используется в качестве кодировки текста для системных интерфейсов, независимо от текущей настройки локали.
-
возвращает ‘UTF-8’ (кодировка локали игнорируется). возвращает ‘UTF-8’ (кодировка локали игнорируется, а параметр функции do_setlocale не действует). , sys.stdout и sys.stderr все используют UTF-8 в качестве кодировки текста, при этом surrogateescape обработчик ошибки включён для sys.stdin и sys.stdout ( sys.stderr продолжает использовать backslashreplace , как и в режиме с учётом локали по умолчанию)
Вследствие изменений в этих API нижнего уровня другие API более высокого уровня также демонстрируют другое поведение по умолчанию:
- Аргументы командной строки, переменные среды и имена файлов декодируются в текст с использованием кодировки UTF-8. и os.fsencode() используют кодировку UTF-8. , io.open() и codecs.open() по умолчанию используют кодировку UTF-8. Однако они по-прежнему используют строгий обработчик ошибок по умолчанию, так что попытка открыть двоичный файл в текстовом режиме может вызвать исключение, а не создавать бессмысленные данные.
Обратите внимание, что стандартные настройки потока в режиме UTF-8 могут быть отменены PYTHONIOENCODING (так же, как они могут быть в режиме с учётом локали по умолчанию).
Если установлено значение 0 , интерпретатор работает в режиме с учётом локали по умолчанию.
Установка любой другой непустой строки вызывает ошибку при инициализации интерпретатора.
Если эта переменная среды вообще не задана, то интерпретатор по умолчанию использует текущие настройки локали, если текущая локаль не определена как устаревшая локаль на основе ASCII (как описано для PYTHONCOERCECLOCALE ), и принуждение локали отключено или не работает. В таких устаревших региональных стандартах интерпретатор по умолчанию включает режим UTF-8, если явно не указано иное.
Также доступена как опция -X utf8 .
Добавлено в версии 3.7: См. PEP 540 для получения более подробной информации.
1.2.1. Переменные режима отладки¶
Установка этих переменных влияет только на отладочную сборку Python.
Если установлена, Python будет печатать отладочную информацию о потоках.
Нужен Python, настроенный с опцией сборки —with-pydebug .
Если установлено, Python будет сбрасывать объекты и счётчики ссылок, все ещё живые после завершения работы интерпретатора.