Документация Python неофициальный перевод

runpy.md

86 строк · 13.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/runpy.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 29.5. [`runpy`](https://python-all.ru/3.2/library/runpy.html#module-runpy) – Поиск и выполнение модулей Python89**Исходный код:** [Lib/runpy.py](https://python-all.ru/src/3.2/Lib/runpy.py)1011---1213Модуль [`runpy`](https://python-all.ru/3.2/library/runpy.html#module-runpy) используется для поиска и запуска модулей Python без их предварительного импорта. Его основное назначение – реализация ключа командной строки [*-m*](https://python-all.ru/3.2/using/cmdline.html#cmdoption-m), который позволяет находить скрипты с использованием пространства имён модулей Python вместо файловой системы.1415Обратите внимание: это *не* изолированный модуль – весь код выполняется в текущем процессе, и все побочные эффекты (например, кешированные импорты других модулей) сохраняются после возврата из функций.1617Кроме того, любые функции и классы, определённые в выполняемом коде, не гарантируют корректную работу после возврата из функции [`runpy`](https://python-all.ru/3.2/library/runpy.html#module-runpy). Если такое ограничение неприемлемо для конкретного случая использования, [`importlib`](https://python-all.ru/3.2/library/importlib.html#module-importlib), скорее всего, будет более подходящим выбором, чем этот модуль.1819Модуль [`runpy`](https://python-all.ru/3.2/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.2/library/runpy.html)), а затем выполняется в новом пространстве имён модуля.2425Если указанное имя модуля ссылается на пакет, а не на обычный модуль, то этот пакет импортируется, и выполняется подмодуль `__main__` внутри этого пакета, после чего возвращается результирующий словарь глобалов модуля.2627Необязательный аргумент-словарь *init\_globals* можно использовать для предварительного заполнения словаря глобалов модуля до выполнения кода. Переданный словарь не будет изменён. Если какие-либо из специальных глобальных переменных, перечисленных ниже, определены в переданном словаре, эти определения переопределяются функцией [`run_module()`](https://python-all.ru/3.2/library/runpy.html#runpy.run_module).2829Специальные глобальные переменные `__name__`, `__file__`, `__cached__`, `__loader__` и `__package__` устанавливаются в словаре глобальных переменных перед выполнением кода модуля (обратите внимание, что это минимальный набор переменных – остальные могут быть установлены неявно как деталь реализации интерпретатора).3031`__name__` устанавливается в значение *run\_name*, если этот необязательный аргумент не равен [`None`](https://python-all.ru/3.2/library/constants.html#None); в `mod_name + '.__main__'`, если указанный модуль является пакетом; и в значение аргумента *mod\_name* в противном случае.3233`__file__` устанавливается в имя, предоставленное загрузчиком модуля. Если загрузчик не предоставляет информацию об имени файла, эта переменная устанавливается в [`None`](https://python-all.ru/3.2/library/constants.html#None).3435`__cached__` будет установлена в `None`.3637`__loader__` устанавливается в загрузчик модуля [**PEP 302**](https://python-all.ru/3.2/library/runpy.html), используемый для получения кода модуля (этот загрузчик может быть обёрткой вокруг стандартного механизма импорта).3839`__package__` устанавливается в *mod\_name*, если именованный модуль является пакетом, и в `mod_name.rpartition('.')[0]` в противном случае.4041Если аргумент *alter\_sys* передан и равен [`True`](https://python-all.ru/3.2/library/constants.html#True), то `sys.argv[0]` обновляется значением `__file__`, а `sys.modules[__name__]` – временным объектом модуля для выполняемого модуля. Как `sys.argv[0]`, так и `sys.modules[__name__]` восстанавливаются до исходных значений перед возвратом функции.4243Обратите внимание, что такое манипулирование [`sys`](https://python-all.ru/3.2/library/sys.html#module-sys) не является потокобезопасным. Другие потоки могут видеть частично инициализированный модуль, а также изменённый список аргументов. Рекомендуется не трогать модуль [`sys`](https://python-all.ru/3.2/library/sys.html#module-sys) при вызове этой функции из многопоточного кода.4445Изменено в версии 3.1: добавлена возможность выполнения пакетов путём поиска подмодуля `__main__`.4647Изменено в версии 3.2: добавлена глобальная переменная `__cached__` (см. [**PEP 3147**](https://python-all.ru/3.2/library/runpy.html)).4849#### `runpy.run_path(file_path, init_globals=None, run_name=None)`5051Выполняет код по указанному пути в файловой системе и возвращает результирующий словарь глобалов модуля. Как и имя скрипта, переданное в командной строке CPython, указанный путь может ссылаться на исходный файл Python, скомпилированный байт-код или запись sys.path, содержащую модуль `__main__` (например, zip-файл, содержащий файл `__main__.py` верхнего уровня).5253Для простого скрипта указанный код просто выполняется в новом пространстве имён модуля. Для корректной записи sys.path (обычно zip-файл или каталог) запись сначала добавляется в начало `sys.path`. Затем функция ищет и выполняет модуль [`__main__`](https://python-all.ru/3.2/library/__main__.html#module-__main__) с использованием обновлённого пути. Обратите внимание, что нет специальной защиты от вызова существующей записи [`__main__`](https://python-all.ru/3.2/library/__main__.html#module-__main__), расположенной в другом месте `sys.path`, если такой модуль отсутствует по указанному пути.5455Необязательный аргумент-словарь *init\_globals* можно использовать для предварительного заполнения словаря глобалов модуля до выполнения кода. Переданный словарь не будет изменён. Если какие-либо из специальных глобальных переменных, перечисленных ниже, определены в переданном словаре, эти определения переопределяются функцией [`run_path()`](https://python-all.ru/3.2/library/runpy.html#runpy.run_path).5657Специальные глобальные переменные `__name__`, `__file__`, `__loader__` и `__package__` устанавливаются в словаре глобальных переменных перед выполнением кода модуля (обратите внимание, что это минимальный набор переменных – остальные могут быть установлены неявно как деталь реализации интерпретатора).5859`__name__` устанавливается в значение *run\_name*, если этот необязательный аргумент не равен [`None`](https://python-all.ru/3.2/library/constants.html#None), и в `'<run_path>'` в противном случае.6061`__file__` устанавливается в имя, предоставленное загрузчиком модуля. Если загрузчик не предоставляет информацию об имени файла, эта переменная устанавливается в [`None`](https://python-all.ru/3.2/library/constants.html#None). Для простого скрипта она будет установлена в `file_path`.6263`__loader__` устанавливается в загрузчик модуля [**PEP 302**](https://python-all.ru/3.2/library/runpy.html), используемый для получения кода модуля (этот загрузчик может быть обёрткой вокруг стандартного механизма импорта). Для простого скрипта он будет установлен в [`None`](https://python-all.ru/3.2/library/constants.html#None).6465`__package__` устанавливается в `__name__.rpartition('.')[0]`.6667Также в модуль [`sys`](https://python-all.ru/3.2/library/sys.html#module-sys) вносится ряд изменений. Во-первых, `sys.path` может быть изменён, как описано выше. `sys.argv[0]` обновляется значением `file_path`, а `sys.modules[__name__]` обновляется временным объектом модуля для выполняемого модуля. Все изменения элементов в [`sys`](https://python-all.ru/3.2/library/sys.html#module-sys) отменяются перед возвратом функции.6869Обратите внимание, что, в отличие от [`run_module()`](https://python-all.ru/3.2/library/runpy.html#runpy.run_module), изменения, вносимые в [`sys`](https://python-all.ru/3.2/library/sys.html#module-sys), не являются необязательными в этой функции, поскольку эти корректировки необходимы для разрешения выполнения записей sys.path. Поскольку ограничения потокобезопасности по-прежнему действуют, использование этой функции в многопоточном коде должно быть либо сериализовано с помощью блокировки импорта, либо делегировано отдельному процессу.7071Новое в версии 3.2.7273> **См. также**74>75> **[**PEP 338**](https://python-all.ru/3.2/library/runpy.html) – Выполнение модулей как сценариев**76>77> PEP написан и реализован Ником Когланом.78>79> **[**PEP 366**](https://python-all.ru/3.2/library/runpy.html) – Явные относительные импорты главного модуля**80>81> PEP написан и реализован Ником Когланом.82>83> [*Командная строка и окружение*](https://python-all.ru/3.2/using/cmdline.html#using-on-general) – подробности о командной строке CPython84>85> Функция [`importlib.import_module()`](https://python-all.ru/3.2/library/importlib.html#importlib.import_module)86