runpy.md
1> **Источник:** https://python-all.ru/3.11/library/runpy.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`runpy`](https://python-all.ru/3.11/library/runpy.html#module-runpy) – Поиск и выполнение модулей Python89**Исходный код:** [Lib/runpy.py](https://python-all.ru/src/3.11/Lib/runpy.py)1011---1213Модуль [`runpy`](https://python-all.ru/3.11/library/runpy.html#module-runpy) используется для поиска и запуска модулей Python без их предварительного импорта. Основное его применение – реализация ключа командной строки [`-m`](https://python-all.ru/3.11/using/cmdline.html#cmdoption-m), который позволяет находить скрипты через пространство имён модулей Python, а не через файловую систему.1415Обратите внимание: это *не* изолированный модуль – весь код выполняется в текущем процессе, и все побочные эффекты (например, кешированные импорты других модулей) сохраняются после возврата из функций.1617Кроме того, любые функции и классы, определённые выполняемым кодом, не гарантируют корректной работы после возврата из функции [`runpy`](https://python-all.ru/3.11/library/runpy.html#module-runpy). Если такое ограничение неприемлемо для конкретного случая, [`importlib`](https://python-all.ru/3.11/library/importlib.html#module-importlib), скорее всего, будет более подходящим выбором, чем этот модуль.1819Модуль [`runpy`](https://python-all.ru/3.11/library/runpy.html#module-runpy) предоставляет две функции:2021#### `runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)`2223Выполняет код указанного модуля и возвращает результирующий словарь глобальных переменных модуля. Сначала код модуля находится с помощью стандартного механизма импорта (подробнее см. [**PEP 302**](https://python-all.ru/3.11/library/runpy.html)), а затем выполняется в новом пространстве имён модуля.2425Аргумент *mod\_name* должен быть абсолютным именем модуля. Если имя модуля указывает на пакет, а не на обычный модуль, то этот пакет импортируется, а затем выполняется подмодуль [`__main__`](https://python-all.ru/3.11/library/__main__.html#module-__main__) внутри этого пакета, и возвращается словарь глобальных переменных полученного модуля.2627Необязательный аргумент-словарь *init\_globals* можно использовать для предварительного заполнения словаря глобальных переменных модуля до выполнения кода. Переданный словарь не будет изменён. Если какие-либо из специальных глобальных переменных, перечисленных ниже, определены в переданном словаре, эти определения переопределяются вызовом [`run_module()`](https://python-all.ru/3.11/library/runpy.html#runpy.run_module).2829Специальные глобальные переменные `__name__`, `__spec__`, `__file__`, `__cached__`, `__loader__` и `__package__` устанавливаются в словаре глобальных переменных перед выполнением кода модуля (обратите внимание: это минимальный набор переменных; другие переменные могут устанавливаться неявно в зависимости от реализации интерпретатора).3031`__name__` устанавливается в *run\_name*, если этот необязательный аргумент не равен [`None`](https://python-all.ru/3.11/library/constants.html#None), в `mod_name + '.__main__'`, если указанный модуль является пакетом, и в аргумент *mod\_name* в противном случае.3233`__spec__` будет установлен соответствующим образом для *фактически* импортированного модуля (то есть `__spec__.name` всегда будет *mod\_name* или `mod_name + '.__main__`, но никогда *run\_name*).3435`__file__`, `__cached__`, `__loader__` и `__package__` [устанавливаются обычным образом](https://python-all.ru/3.11/reference/import.html#import-mod-attrs) на основе спецификации модуля.3637Если аргумент *alter\_sys* передан и его значение равно [`True`](https://python-all.ru/3.11/library/constants.html#True), то `sys.argv[0]` обновляется значением `__file__`, а `sys.modules[__name__]` обновляется временным объектом модуля для выполняемого модуля. Оба `sys.argv[0]` и `sys.modules[__name__]` восстанавливаются до исходных значений перед возвратом из функции.3839Обратите внимание: такие манипуляции с [`sys`](https://python-all.ru/3.11/library/sys.html#module-sys) не являются потокобезопасными. Другие потоки могут увидеть частично инициализированный модуль, а также изменённый список аргументов. Рекомендуется оставить модуль `sys` в покое при вызове этой функции из многопоточного кода.4041> **См. также**42>43> Параметр [`-m`](https://python-all.ru/3.11/using/cmdline.html#cmdoption-m) предоставляет эквивалентную функциональность из командной строки.4445Изменено в версии 3.1: Добавлена возможность выполнять пакеты путём поиска подмодуля [`__main__`](https://python-all.ru/3.11/library/__main__.html#module-__main__).4647Изменено в версии 3.2: Добавлена глобальная переменная `__cached__` (см. [**PEP 3147**](https://python-all.ru/3.11/library/runpy.html)).4849Изменено в версии 3.4: Обновлено для использования возможностей спецификации модуля, добавленных [**PEP 451**](https://python-all.ru/3.11/library/runpy.html). Это позволяет правильно устанавливать `__cached__` для модулей, запускаемых таким образом, а также гарантирует, что настоящее имя модуля всегда доступно как `__spec__.name`.5051#### `runpy.run_path(path_name, init_globals=None, run_name=None)`5253Выполняет код по указанному пути в файловой системе и возвращает результирующий словарь глобальных переменных модуля. Как и имя сценария, переданное в командную строку CPython, переданный путь может указывать на исходный файл Python, скомпилированный байт-код или корректную запись [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path), содержащую модуль [`__main__`](https://python-all.ru/3.11/library/__main__.html#module-__main__) (например, zip-файл, содержащий файл `__main__.py` верхнего уровня).5455Для простого скрипта указанный код просто выполняется в новом пространстве имён модуля. Для корректной записи [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path) (обычно zip-файла или каталога) запись сначала добавляется в начало `sys.path`. Затем функция ищет и выполняет модуль [`__main__`](https://python-all.ru/3.11/library/__main__.html#module-__main__), используя обновлённый путь. Обратите внимание: нет специальной защиты от вызова существующей записи `__main__`, расположенной в другом месте `sys.path`, если в указанном месте такого модуля нет.5657Необязательный аргумент-словарь *init\_globals* можно использовать для предварительного заполнения словаря глобальных переменных модуля до выполнения кода. Переданный словарь не будет изменён. Если какие-либо из специальных глобальных переменных, перечисленных ниже, определены в переданном словаре, эти определения переопределяются вызовом [`run_path()`](https://python-all.ru/3.11/library/runpy.html#runpy.run_path).5859Специальные глобальные переменные `__name__`, `__spec__`, `__file__`, `__cached__`, `__loader__` и `__package__` устанавливаются в словаре глобальных переменных перед выполнением кода модуля (обратите внимание: это минимальный набор переменных; другие переменные могут устанавливаться неявно в зависимости от реализации интерпретатора).6061`__name__` устанавливается в *run\_name*, если этот необязательный аргумент не равен [`None`](https://python-all.ru/3.11/library/constants.html#None), и в `'<run_path>'` в противном случае.6263Если переданный путь напрямую указывает на файл сценария (исходный код или предварительно скомпилированный байт-код), то `__file__` будет установлен в переданный путь, а `__spec__`, `__cached__`, `__loader__` и `__package__` будут установлены в [`None`](https://python-all.ru/3.11/library/constants.html#None).6465Если переданный путь является ссылкой на корректную запись [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path), то `__spec__` будет установлен соответствующим образом для импортируемого модуля [`__main__`](https://python-all.ru/3.11/library/__main__.html#module-__main__) (то есть `__spec__.name` всегда будет равно `__main__`). `__file__`, `__cached__`, `__loader__` и `__package__` будут [установлены как обычно](https://python-all.ru/3.11/reference/import.html#import-mod-attrs) на основе спецификации модуля.6667В модуль [`sys`](https://python-all.ru/3.11/library/sys.html#module-sys) также вносится ряд изменений. Во-первых, [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path) может быть изменён, как описано выше. `sys.argv[0]` обновляется значением `path_name`, а `sys.modules[__name__]` обновляется временным объектом модуля для выполняемого модуля. Все изменения элементов в [`sys`](https://python-all.ru/3.11/library/sys.html#module-sys) отменяются до возврата функции.6869Обратите внимание: в отличие от [`run_module()`](https://python-all.ru/3.11/library/runpy.html#runpy.run_module), изменения в [`sys`](https://python-all.ru/3.11/library/sys.html#module-sys) в этой функции не являются необязательными, поскольку они необходимы для обеспечения выполнения записей [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path). Поскольку ограничения потокобезопасности по-прежнему действуют, использование этой функции в многопоточном коде должно быть либо сериализовано с помощью блокировки импорта, либо делегировано отдельному процессу.7071> **См. также**72>73> [Параметры интерфейса](https://python-all.ru/3.11/using/cmdline.html#using-on-interface-options) для эквивалентной функциональности в командной строке (`python path/to/script`).7475Новое в версии 3.2.7677Изменено в версии 3.4: Обновлено для использования возможностей спецификации модулей, добавленных в [**PEP 451**](https://python-all.ru/3.11/library/runpy.html). Это позволяет корректно установить `__cached__` в случае, когда `__main__` импортируется из допустимой записи [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path), а не выполняется напрямую.7879> **См. также**80>81> **[**PEP 338**](https://python-all.ru/3.11/library/runpy.html) – Выполнение модулей как сценариев**82>83> PEP написан и реализован Ником Когланом.84>85> **[**PEP 366**](https://python-all.ru/3.11/library/runpy.html) – Явные относительные импорты главного модуля**86>87> PEP написан и реализован Ником Когланом.88>89> **[**PEP 451**](https://python-all.ru/3.11/library/runpy.html) – Тип ModuleSpec для системы импорта**90>91> PEP написан и реализован Эриком Сноу.92>93> [Командная строка и окружение](https://python-all.ru/3.11/using/cmdline.html#using-on-general) – подробности о командной строке CPython94>95> Функция [`importlib.import_module()`](https://python-all.ru/3.11/library/importlib.html#importlib.import_module)96