sys.md
1> **Источник:** https://python-all.ru/3.15/c-api/sys.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Утилиты операционной системы89#### `PyObject *PyOS_FSPath(PyObject *path)`1011*Возвращаемое значение: новая ссылка.*1213*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.6.*1415Возвращает представление файловой системы для *path*. Если объект является объектом [`str`](https://python-all.ru/3.15/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes), возвращается новая [сильная ссылка](https://python-all.ru/3.15/glossary.html#term-strong-reference). Если объект реализует интерфейс [`os.PathLike`](https://python-all.ru/3.15/library/os.html#os.PathLike), то возвращается [`__fspath__()`](https://python-all.ru/3.15/library/os.html#os.PathLike.__fspath__), если это объект `str` или `bytes`. В противном случае возбуждается [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError) и возвращается `NULL`.1617Добавлено в версии 3.6.1819#### `int Py_FdIsInteractive(FILE *fp, const char *filename)`2021Возвращает истину (ненулевое значение), если стандартный файл ввода-вывода *fp* с именем *filename* считается интерактивным. Это верно для файлов, для которых `isatty(fileno(fp))` истинно. Если [`PyConfig.interactive`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig.interactive) не равен нулю, эта функция также возвращает истину, если указатель *filename* равен `NULL` или имя совпадает с одной из строк `'<stdin>'` или `'???'`.2223Эту функцию нельзя вызывать до инициализации Python.2425#### `void PyOS_BeforeFork()`2627*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) на платформах с fork() начиная с версии 3.7.*2829Функция для подготовки внутреннего состояния перед ветвлением процесса. Её следует вызывать перед вызовом `fork()` или любой аналогичной функции, клонирующей текущий процесс. Доступна только в системах, где определён `fork()`.3031> **Предупреждение**32>33> Вызов C `fork()` должен выполняться только из [«главного» потока](https://python-all.ru/3.15/c-api/threads.html#fork-and-threads) ([«главного» интерпретатора](https://python-all.ru/3.15/c-api/subinterpreters.html#sub-interpreter-support)). То же самое верно для `PyOS_BeforeFork()`.3435Добавлено в версии 3.7.3637#### `void PyOS_AfterFork_Parent()`3839*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) на платформах с fork() начиная с версии 3.7.*4041Функция для обновления внутреннего состояния после ветвления процесса. Её следует вызывать из родительского процесса после вызова `fork()` или любой аналогичной функции, клонирующей текущий процесс, независимо от того, успешно ли прошло клонирование. Доступна только в системах, где определён `fork()`.4243> **Предупреждение**44>45> Вызов C `fork()` должен выполняться только из [«главного» потока](https://python-all.ru/3.15/c-api/threads.html#fork-and-threads) ([«главного» интерпретатора](https://python-all.ru/3.15/c-api/subinterpreters.html#sub-interpreter-support)). То же самое верно для `PyOS_AfterFork_Parent()`.4647Добавлено в версии 3.7.4849#### `void PyOS_AfterFork_Child()`5051*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) на платформах с fork() начиная с версии 3.7.*5253Функция для обновления внутреннего состояния интерпретатора после ветвления процесса. Её необходимо вызывать из дочернего процесса после вызова `fork()` или любой аналогичной функции, клонирующей текущий процесс, если есть вероятность, что процесс снова вызовет интерпретатор Python. Доступна только в системах, где определён `fork()`.5455> **Предупреждение**56>57> Вызов C `fork()` должен выполняться только из [«главного» потока](https://python-all.ru/3.15/c-api/threads.html#fork-and-threads) ([«главного» интерпретатора](https://python-all.ru/3.15/c-api/subinterpreters.html#sub-interpreter-support)). То же самое верно для `PyOS_AfterFork_Child()`.5859Добавлено в версии 3.7.6061> **См. также**62>63> [`os.register_at_fork()`](https://python-all.ru/3.15/library/os.html#os.register_at_fork) позволяет регистрировать пользовательские функции Python, которые будут вызываться [`PyOS_BeforeFork()`](https://python-all.ru/3.15/c-api/sys.html#c.PyOS_BeforeFork), [`PyOS_AfterFork_Parent()`](https://python-all.ru/3.15/c-api/sys.html#c.PyOS_AfterFork_Parent) и [`PyOS_AfterFork_Child()`](https://python-all.ru/3.15/c-api/sys.html#c.PyOS_AfterFork_Child).6465#### `void PyOS_AfterFork()`6667*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) на платформах с fork().*6869Функция для обновления некоторого внутреннего состояния после ветвления процесса; её следует вызвать в новом процессе, если интерпретатор Python будет продолжать использоваться. Если в новый процесс загружается новый исполняемый файл, эту функцию вызывать не нужно.7071Устарело с версии 3.7: Эта функция заменена на [`PyOS_AfterFork_Child()`](https://python-all.ru/3.15/c-api/sys.html#c.PyOS_AfterFork_Child).7273#### `int PyOS_CheckStack()`7475*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) на платформах с USE\_STACKCHECK начиная с версии 3.7.*7677Возвращает истину, когда в интерпретаторе заканчивается место в стеке. Это надёжная проверка, но доступна только когда определён `USE_STACKCHECK` (в настоящее время на некоторых версиях Windows с компилятором Microsoft Visual C++). `USE_STACKCHECK` будет определён автоматически; не следует изменять это определение в своём коде.7879#### `typedef void (*PyOS_sighandler_t)(int)`8081*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*8283#### `PyOS_sighandler_t PyOS_getsig(int i)`8485*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*8687Возвращает текущий обработчик сигнала для сигнала *i*. Это тонкая обёртка вокруг `sigaction()` или `signal()`. Не вызывайте эти функции напрямую!8889#### `PyOS_sighandler_t PyOS_setsig(int i, PyOS_sighandler_t h)`9091*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*9293Устанавливает обработчик сигнала для сигнала *i* равным *h*; возвращает старый обработчик сигнала. Это тонкая обёртка вокруг `sigaction()` или `signal()`. Не вызывайте эти функции напрямую!9495#### `int PyOS_InterruptOccurred(void)`9697*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*9899Проверяет, был ли получен сигнал `SIGINT`.100101Возвращает `1`, если произошло `SIGINT`, и очищает флаг сигнала, иначе `0`.102103В большинстве случаев следует предпочесть [`PyErr_CheckSignals()`](https://python-all.ru/3.15/c-api/exceptions.html#c.PyErr_CheckSignals) этой функции. `PyErr_CheckSignals()` вызывает соответствующие обработчики сигналов для всех ожидающих сигналов, позволяя коду Python корректно обработать сигнал. Эта функция только обнаруживает `SIGINT` и не вызывает никаких обработчиков сигналов Python.104105Эта функция безопасна для асинхронных сигналов и не может завершиться ошибкой. Вызывающий должен владеть [присоединённым состоянием потока](https://python-all.ru/3.15/glossary.html#term-attached-thread-state).106107#### `wchar_t *Py_DecodeLocale(const char *arg, size_t *size)`108109*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.7.*110111> **Предупреждение**112>113> Эту функцию не следует вызывать напрямую: используйте API [`PyConfig`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig) с функцией [`PyConfig_SetBytesString()`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig_SetBytesString), которая гарантирует, что [Python предварительно инициализирован](https://python-all.ru/3.15/c-api/init_config.html#c-preinit).114>115> Эту функцию нельзя вызывать до того, как [Python будет предварительно инициализирован](https://python-all.ru/3.15/c-api/init_config.html#c-preinit), и чтобы локаль LC\_CTYPE была правильно настроена: см. функцию [`Py_PreInitialize()`](https://python-all.ru/3.15/c-api/init_config.html#c.Py_PreInitialize).116117Декодирует байтовую строку с использованием [кодировки файловой системы и обработчика ошибок](https://python-all.ru/3.15/glossary.html#term-filesystem-encoding-and-error-handler). Если обработчик ошибок – [обработчик ошибок surrogateescape](https://python-all.ru/3.15/library/codecs.html#surrogateescape), не декодируемые байты декодируются как символы в диапазоне U+DC80..U+DCFF; а если последовательность байтов может быть декодирована как суррогатный символ, то байты экранируются с помощью обработчика ошибок surrogateescape вместо их декодирования.118119Возвращает указатель на новую выделенную строку широких символов; для освобождения памяти используйте [`PyMem_RawFree()`](https://python-all.ru/3.15/c-api/memory.html#c.PyMem_RawFree). Если size не равен `NULL`, записывает количество широких символов, исключая нулевой символ, в `*size`.120121Возвращает `NULL` при ошибке декодирования или ошибке выделения памяти. Если *size* не равен `NULL`, `*size` устанавливается в `(size_t)-1` при ошибке памяти или в `(size_t)-2` при ошибке декодирования.122123[Кодировка файловой системы и обработчик ошибок](https://python-all.ru/3.15/glossary.html#term-filesystem-encoding-and-error-handler) выбираются с помощью [`PyConfig_Read()`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig_Read): см. члены [`filesystem_encoding`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig.filesystem_encoding) и [`filesystem_errors`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig.filesystem_errors) структуры [`PyConfig`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig).124125Ошибки декодирования никогда не должны происходить, если только нет ошибки в библиотеке C.126127Используйте функцию [`Py_EncodeLocale()`](https://python-all.ru/3.15/c-api/sys.html#c.Py_EncodeLocale) для обратного кодирования строки символов в байтовую строку.128129> **См. также**130>131> Функции [`PyUnicode_DecodeFSDefaultAndSize()`](https://python-all.ru/3.15/c-api/unicode.html#c.PyUnicode_DecodeFSDefaultAndSize) и [`PyUnicode_DecodeLocaleAndSize()`](https://python-all.ru/3.15/c-api/unicode.html#c.PyUnicode_DecodeLocaleAndSize).132133Добавлено в версии 3.5.134135Изменено в версии 3.7: Теперь функция использует кодировку UTF-8 в [режиме UTF-8 Python](https://python-all.ru/3.15/library/os.html#utf8-mode).136137Изменено в версии 3.8: Теперь функция использует кодировку UTF-8 в Windows, если [`PyPreConfig.legacy_windows_fs_encoding`](https://python-all.ru/3.15/c-api/init_config.html#c.PyPreConfig.legacy_windows_fs_encoding) равен нулю;138139#### `char *Py_EncodeLocale(const wchar_t *text, size_t *error_pos)`140141*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.7.*142143Кодирует строку широких символов в [кодировку файловой системы и обработчик ошибок](https://python-all.ru/3.15/glossary.html#term-filesystem-encoding-and-error-handler). Если обработчик ошибок – [обработчик ошибок surrogateescape](https://python-all.ru/3.15/library/codecs.html#surrogateescape), суррогатные символы в диапазоне U+DC80..U+DCFF преобразуются в байты 0x80..0xFF.144145Возвращает указатель на новую выделенную байтовую строку; для освобождения памяти используйте [`PyMem_Free()`](https://python-all.ru/3.15/c-api/memory.html#c.PyMem_Free). Возвращает `NULL` при ошибке кодирования или ошибке выделения памяти.146147Если error\_pos не равен `NULL`, то `*error_pos` устанавливается в `(size_t)-1` в случае успеха или в индекс недопустимого символа при ошибке кодирования.148149[Кодировка файловой системы и обработчик ошибок](https://python-all.ru/3.15/glossary.html#term-filesystem-encoding-and-error-handler) выбираются с помощью [`PyConfig_Read()`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig_Read): см. члены [`filesystem_encoding`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig.filesystem_encoding) и [`filesystem_errors`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig.filesystem_errors) структуры [`PyConfig`](https://python-all.ru/3.15/c-api/init_config.html#c.PyConfig).150151Используйте функцию [`Py_DecodeLocale()`](https://python-all.ru/3.15/c-api/sys.html#c.Py_DecodeLocale) для обратного декодирования байтовой строки в строку широких символов.152153> **Предупреждение**154>155> Эту функцию нельзя вызывать до того, как [Python будет предварительно инициализирован](https://python-all.ru/3.15/c-api/init_config.html#c-preinit), и чтобы локаль LC\_CTYPE была правильно настроена: см. функцию [`Py_PreInitialize()`](https://python-all.ru/3.15/c-api/init_config.html#c.Py_PreInitialize).156157> **См. также**158>159> Функции [`PyUnicode_EncodeFSDefault()`](https://python-all.ru/3.15/c-api/unicode.html#c.PyUnicode_EncodeFSDefault) и [`PyUnicode_EncodeLocale()`](https://python-all.ru/3.15/c-api/unicode.html#c.PyUnicode_EncodeLocale).160161Добавлено в версии 3.5.162163Изменено в версии 3.7: Теперь функция использует кодировку UTF-8 в [режиме UTF-8 Python](https://python-all.ru/3.15/library/os.html#utf8-mode).164165Изменено в версии 3.8: Теперь функция использует кодировку UTF-8 в Windows, если [`PyPreConfig.legacy_windows_fs_encoding`](https://python-all.ru/3.15/c-api/init_config.html#c.PyPreConfig.legacy_windows_fs_encoding) равен нулю.166167#### `FILE *Py_fopen(PyObject *path, const char *mode)`168169Аналогично `fopen()`, но *path* является объектом Python, и в случае ошибки устанавливается исключение.170171*path* должен быть объектом [`str`](https://python-all.ru/3.15/library/stdtypes.html#str), объектом [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes) или [объектом, подобным пути](https://python-all.ru/3.15/glossary.html#term-path-like-object).172173В случае успеха возвращает новый файловый указатель. В случае ошибки устанавливает исключение и возвращает `NULL`.174175Файл должен быть закрыт через [`Py_fclose()`](https://python-all.ru/3.15/c-api/sys.html#c.Py_fclose), а не прямым вызовом `fclose()`.176177Файловый дескриптор создаётся ненаследуемым ([**PEP 446**](https://python-all.ru/3.15/c-api/sys.html)).178179Вызывающий должен иметь [прикреплённое состояние потока](https://python-all.ru/3.15/glossary.html#term-attached-thread-state).180181Добавлено в версии 3.14.182183#### `int Py_fclose(FILE *file)`184185Закрывает файл, открытый вызовом [`Py_fopen()`](https://python-all.ru/3.15/c-api/sys.html#c.Py_fopen).186187В случае успеха возвращает `0`. При ошибке возвращает `EOF`, а `errno` устанавливается для указания ошибки. В любом случае любой дальнейший доступ (включая повторный вызов [`Py_fclose()`](https://python-all.ru/3.15/c-api/sys.html#c.Py_fclose)) к потоку данных приводит к неопределённому поведению.188189Добавлено в версии 3.14.190191# Системные функции192193Это служебные функции, предоставляющие функциональность модуля [`sys`](https://python-all.ru/3.15/library/sys.html#module-sys) коду на C. Все они работают со словарём модуля `sys` текущего потока интерпретатора, который хранится во внутренней структуре состояния потока.194195#### `PyObject *PySys_GetAttr(PyObject *name)`196197*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*198199Возвращает атрибут *name* модуля [`sys`](https://python-all.ru/3.15/library/sys.html#module-sys). Возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference). Вызывает [`RuntimeError`](https://python-all.ru/3.15/library/exceptions.html#RuntimeError) и возвращает `NULL`, если атрибут отсутствует или модуль `sys` не найден.200201Если отсутствие объекта не должно считаться ошибкой, можно использовать [`PySys_GetOptionalAttr()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_GetOptionalAttr) вместо этой функции.202203Добавлено в версии 3.15.204205#### `PyObject *PySys_GetAttrString(const char *name)`206207*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*208209То же, что и [`PySys_GetAttr()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_GetAttr), но *name* задаётся как const char\* строка байтов в кодировке UTF-8, а не как [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*.210211Если отсутствие объекта не должно считаться ошибкой, можно использовать [`PySys_GetOptionalAttrString()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_GetOptionalAttrString) вместо этой функции.212213Добавлено в версии 3.15.214215#### `int PySys_GetOptionalAttr(PyObject *name, PyObject **result)`216217*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*218219Вариант [`PySys_GetAttr()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_GetAttr), который не вызывает исключение, если объект не существует.220221- Устанавливает *\*result* в новую [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на объект и возвращает `1`, если объект существует.222- Устанавливает *\*result* в `NULL` и возвращает `0` без установки исключения, если объект не существует.223- Устанавливает исключение, устанавливает *\*result* в `NULL` и возвращает `-1`, если произошла ошибка.224225Добавлено в версии 3.15.226227#### `int PySys_GetOptionalAttrString(const char *name, PyObject **result)`228229*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.15.*230231То же, что и [`PySys_GetOptionalAttr()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_GetOptionalAttr), но *name* задаётся как const char\* строка байтов в кодировке UTF-8, а не как [PyObject](https://python-all.ru/3.15/c-api/structures.html#c.PyObject)\*.232233Добавлено в версии 3.15.234235#### `PyObject *PySys_GetObject(const char *name)`236237*Возвращаемое значение: заимствованная ссылка.*238239*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*240241Аналогично [`PySys_GetAttrString()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_GetAttrString), но возвращает [заимствованную ссылку](https://python-all.ru/3.15/glossary.html#term-borrowed-reference) и возвращает `NULL` *без* установки исключения при ошибке.242243Сохраняет исключение, которое было установлено до вызова.244245#### `int PySys_SetObject(const char *name, PyObject *v)`246247*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*248249Устанавливает *name* в модуле [`sys`](https://python-all.ru/3.15/library/sys.html#module-sys) равным *v*, если *v* не равно `NULL`; в противном случае *name* удаляется из модуля sys. Возвращает `0` в случае успеха, `-1` при ошибке.250251#### `void PySys_WriteStdout(const char *format, ...)`252253*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*254255Записывает выходную строку, описываемую *format*, в [`sys.stdout`](https://python-all.ru/3.15/library/sys.html#sys.stdout). Исключения не вызываются, даже если произошло усечение (см. ниже).256257*format* должен ограничивать общий размер форматированной выходной строки до 1000 байт или менее – после 1000 байт строка усекается. В частности, это означает, что не должно быть неограниченных форматов «%s»; их следует ограничивать с помощью «%.\<N\>s», где \<N\> – десятичное число, рассчитанное так, чтобы \<N\> плюс максимальный размер другого форматированного текста не превышал 1000 байт. Также следует остерегаться «%f», который может печатать сотни цифр для очень больших чисел.258259Если возникает проблема или [`sys.stdout`](https://python-all.ru/3.15/library/sys.html#sys.stdout) не задан, форматированное сообщение записывается в настоящий (на уровне C) *stdout*.260261#### `void PySys_WriteStderr(const char *format, ...)`262263*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*264265Аналогично [`PySys_WriteStdout()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_WriteStdout), но выводит в [`sys.stderr`](https://python-all.ru/3.15/library/sys.html#sys.stderr) или *stderr* вместо этого.266267#### `void PySys_FormatStdout(const char *format, ...)`268269*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*270271Функция подобна PySys\_WriteStdout(), но форматирует сообщение с помощью [`PyUnicode_FromFormatV()`](https://python-all.ru/3.15/c-api/unicode.html#c.PyUnicode_FromFormatV) и не обрезает сообщение до произвольной длины.272273Добавлено в версии 3.2.274275#### `void PySys_FormatStderr(const char *format, ...)`276277*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*278279Аналогично [`PySys_FormatStdout()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_FormatStdout), но выводит в [`sys.stderr`](https://python-all.ru/3.15/library/sys.html#sys.stderr) или *stderr* вместо этого.280281Добавлено в версии 3.2.282283#### `PyObject *PySys_GetXOptions()`284285*Возвращаемое значение: заимствованная ссылка.*286287*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable) начиная с версии 3.7.*288289Возвращает текущий словарь опций [`-X`](https://python-all.ru/3.15/using/cmdline.html#cmdoption-X), аналогично [`sys._xoptions`](https://python-all.ru/3.15/library/sys.html#sys._xoptions). При ошибке возвращается `NULL` и устанавливается исключение.290291Добавлено в версии 3.2.292293#### `int PySys_Audit(const char *event, const char *format, ...)`294295*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable), начиная с версии 3.13.*296297Вызывает событие аудита с любыми активными перехватчиками. Возвращает ноль при успехе и ненулевое значение с установленным исключением при ошибке.298299Строковый аргумент *event* не должен быть *NULL*.300301Если были добавлены какие-либо перехватчики, *format* и другие аргументы будут использованы для создания кортежа для передачи. За исключением `N`, доступны те же символы форматирования, что и в [`Py_BuildValue()`](https://python-all.ru/3.15/c-api/arg.html#c.Py_BuildValue). Если созданное значение не является кортежем, оно будет добавлено в одноэлементный кортеж.302303Опция форматирования `N` не должна использоваться. Она потребляет ссылку, но, поскольку нет способа узнать, будут ли аргументы этой функции потреблены, её использование может привести к утечкам ссылок.304305Обратите внимание, что символы форматирования `#` всегда должны рассматриваться как [`Py_ssize_t`](https://python-all.ru/3.15/c-api/intro.html#c.Py_ssize_t), независимо от того, был ли определён `PY_SSIZE_T_CLEAN`.306307[`sys.audit()`](https://python-all.ru/3.15/library/sys.html#sys.audit) выполняет ту же функцию из кода Python.308309См. также [`PySys_AuditTuple()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_AuditTuple).310311Добавлено в версии 3.8.312313Изменено в версии 3.8.2: Требуется [`Py_ssize_t`](https://python-all.ru/3.15/c-api/intro.html#c.Py_ssize_t) для символов форматирования `#`. Ранее выдавалось неизбежное предупреждение об устаревании.314315#### `int PySys_AuditTuple(const char *event, PyObject *args)`316317*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable), начиная с версии 3.13.*318319Аналогично [`PySys_Audit()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_Audit), но передаёт аргументы как объект Python. *args* должен быть [`tuple`](https://python-all.ru/3.15/library/stdtypes.html#tuple). Чтобы не передавать аргументы, *args* может быть *NULL*.320321Добавлено в версии 3.13.322323#### `int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)`324325Добавляет вызываемый объект *hook* в список активных перехватчиков аудита. Возвращает ноль при успехе и ненулевое значение при ошибке. Если среда выполнения была инициализирована, также устанавливает ошибку при неудаче. Перехватчики, добавленные через этот API, вызываются для всех интерпретаторов, созданных средой выполнения.326327Указатель *userData* передаётся в функцию-обработчик. Поскольку функции-обработчики могут вызываться из разных сред выполнения, этот указатель не должен напрямую ссылаться на состояние Python.328329Эту функцию можно безопасно вызывать до [`Py_Initialize()`](https://python-all.ru/3.15/c-api/interp-lifecycle.html#c.Py_Initialize). При вызове после инициализации среды выполнения существующие перехватчики аудита уведомляются и могут молча прервать операцию, вызвав ошибку, являющуюся подклассом [`Exception`](https://python-all.ru/3.15/library/exceptions.html#Exception) (другие ошибки не будут скрыты).330331Функция-перехватчик всегда вызывается с [присоединённым состоянием потока](https://python-all.ru/3.15/glossary.html#term-attached-thread-state) интерпретатором Python, который вызвал событие.332333См. [**PEP 578**](https://python-all.ru/3.15/c-api/sys.html) для подробного описания аудита. Функции в среде выполнения и стандартной библиотеке, которые вызывают события, перечислены в [таблице событий аудита](https://python-all.ru/3.15/library/audit_events.html#audit-events). Подробности приведены в документации каждой функции.334335Если интерпретатор инициализирован, эта функция вызывает событие аудита `sys.addaudithook` без аргументов. Если какой-либо из существующих перехватчиков вызывает исключение, производное от [`Exception`](https://python-all.ru/3.15/library/exceptions.html#Exception), новый перехватчик не будет добавлен, и исключение очищается. В результате вызывающие функции не могут считать, что их перехватчик был добавлен, если они не контролируют все существующие перехватчики.336337#### `typedef int (*Py_AuditHookFunction)(const char *event, PyObject *args, void *userData)`338339Тип функции-перехватчика. *event* – это строковый аргумент события (в стиле C), передаваемый в [`PySys_Audit()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_Audit) или [`PySys_AuditTuple()`](https://python-all.ru/3.15/c-api/sys.html#c.PySys_AuditTuple). *args* гарантированно является [`PyTupleObject`](https://python-all.ru/3.15/c-api/tuple.html#c.PyTupleObject). *userData* – аргумент, передаваемый в PySys\_AddAuditHook().340341Добавлено в версии 3.8.342343# Управление процессами344345#### `void Py_FatalError(const char *message)`346347*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*348349Выводит фатальное сообщение об ошибке и завершает процесс. Очистка не выполняется. Эту функцию следует вызывать только при обнаружении условия, которое делает опасным продолжение использования интерпретатора Python; например, когда управление объектами повреждено. В Unix вызывается стандартная функция библиотеки C `abort()`, которая пытается создать файл `core`.350351Функция `Py_FatalError()` заменяется макросом, который автоматически регистрирует имя текущей функции, если не определён макрос `Py_LIMITED_API`.352353Изменено в версии 3.9: Имя функции регистрируется автоматически.354355#### `void Py_Exit(int status)`356357*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*358359Завершает текущий процесс. Вызывает [`Py_FinalizeEx()`](https://python-all.ru/3.15/c-api/interp-lifecycle.html#c.Py_FinalizeEx), а затем вызывает стандартную функцию библиотеки C `exit(status)`. Если `Py_FinalizeEx()` указывает на ошибку, код завершения устанавливается в 120.360361Изменено в версии 3.6: Ошибки при финализации больше не игнорируются.362363#### `int Py_AtExit(void (*func)())`364365*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*366367Регистрирует функцию очистки, которая будет вызвана с помощью [`Py_FinalizeEx()`](https://python-all.ru/3.15/c-api/interp-lifecycle.html#c.Py_FinalizeEx). Функция очистки будет вызвана без аргументов и не должна возвращать значение. Можно зарегистрировать не более 32 функций очистки. При успешной регистрации [`Py_AtExit()`](https://python-all.ru/3.15/c-api/sys.html#c.Py_AtExit) возвращает `0`; при неудаче – `-1`. Последняя зарегистрированная функция очистки вызывается первой. Каждая функция очистки будет вызвана не более одного раза. Поскольку внутренняя финализация Python завершится до вызова функции очистки, *func* не должна вызывать никакие API Python.368369> **См. также**370>371> [`PyUnstable_AtExit()`](https://python-all.ru/3.15/c-api/interp-lifecycle.html#c.PyUnstable_AtExit) для передачи аргумента `void *data`.372