runpy — Поиск и выполнение модулей Python
Исходный код: Lib/runpy.py
Модуль runpy используется для поиска и выполнения модулей Python без их предварительного импорта. Его основное применение — реализация командной строки -m, которая позволяет находить скрипты с использованием пространства имён модулей Python вместо файловой системы.
Обратите внимание, что это не модуль для создания защищённой среды — весь код выполняется в текущем процессе, и любые побочные эффекты (например, кэшированные импорты других модулей) останутся после возвращения функций.
Кроме того, любые функции и классы, определённые выполняемым кодом, не гарантируют корректной работы после возвращения функции runpy. Если это ограничение неприемлемо для данного случая, модуль importlib может оказаться более подходящим выбором, чем этот модуль.
Модуль runpy предоставляет две функции:
-
runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False) -
Выполняет код указанного модуля и возвращает словарь глобальных переменных результата. Сначала код модуля ищется с помощью стандартного механизма импорта (подробности см. в PEP 302), а затем выполняется в новом пространстве имён модуля.
Аргумент mod_name должен быть абсолютным именем модуля. Если имя модуля относится к пакету, а не к обычному модулю, то пакет импортируется, а затем выполняется подмодуль
__main__в этом пакете, и возвращается словарь глобальных переменных результата.Необязательный аргумент init_globals может использоваться для предварительной инициализации словаря глобальных переменных модуля перед выполнением кода. Переданный словарь не будет изменён. Если какие-либо из специальных глобальных переменных ниже определены в переданном словаре, эти определения переопределяются функцией
run_module().Специальные глобальные переменные
__name__,__spec__,__file__,__cached__,__loader__и__package__устанавливаются в словаре глобальных переменных перед выполнением кода модуля (обратите внимание, что это минимальный набор переменных — другие переменные могут быть установлены неявно как деталь реализации интерпретатора).__name__устанавливается в run_name, если этот необязательный аргумент неNone, вmod_name + '.__main__', если указанный модуль является пакетом, и в аргумент mod_name в противном случае.__spec__будет установлено соответствующим образом для фактически импортированного модуля (то есть,__spec__.nameвсегда будет mod_name илиmod_name + '.__main__, никогда run_name).__file__,__cached__,__loader__и__package__устанавливаются обычным образом на основе спецификации модуля.Если аргумент alter_sys задан и его значение равно
True, тоsys.argv[0]обновляется значением__file__, аsys.modules[__name__]обновляется временным объектом модуля для выполняемого модуля. Обаsys.argv[0]иsys.modules[__name__]восстанавливаются до их первоначальных значений до возврата функции.Обратите внимание, что данное манипулирование модулем
sysне является потокобезопасным. Другие потоки могут увидеть частично инициализированный модуль, а также изменённый список аргументов. Рекомендуется избегать модификации модуляsysпри вызове этой функции из потоковой кода.См. также
Опция
-m, предлагающая аналогичную функциональность из командной строки.Изменено в версии 3.1: Добавлена возможность выполнения пакетов, посредством поиска подмодуля
__main__.Изменено в версии 3.2: Добавлена глобальная переменная
__cached__(см. PEP 3147).Изменено в версии 3.4: Обновлено для использования возможности спецификации модуля, добавленной PEP 451. Это позволяет правильно установить
__cached__для модулей, выполняемых таким образом, а также гарантирует, что реальное имя модуля всегда доступно как__spec__.name.
-
runpy.run_path(file_path, init_globals=None, run_name=None) -
Выполняет код по указанному пути в файловой системе и возвращает словарь глобальных переменных результата. Как и в случае со сценарием, переданным в командную строку CPython, указанный путь может ссылаться на файл исходного кода Python, скомпилированный файл байткода или допустимый элемент sys.path, содержащий модуль
__main__(например, архив zipfile, содержащий файл__main__.pyверхнего уровня).Для простого скрипта указанный код просто выполняется в новом пространстве имён модуля. Для допустимого элемента sys.path (обычно zipfile или каталог) элемент сначала добавляется в начало
sys.path. Затем функция ищет и выполняет модуль__main__с использованием обновлённого пути. Обратите внимание, что нет специальной защиты от вызова существующего элемента__main__, расположенного в другом месте вsys.path, если такого модуля нет по указанному пути.Необязательный аргумент init_globals может использоваться для предварительной инициализации словаря глобальных переменных модуля перед выполнением кода. Переданный словарь не будет изменён. Если какие-либо из специальных глобальных переменных ниже определены в переданном словаре, эти определения переопределяются функцией
run_path().Специальные глобальные переменные
__name__,__spec__,__file__,__cached__,__loader__и__package__устанавливаются в словаре глобальных переменных перед выполнением кода модуля (обратите внимание, что это минимальный набор переменных — другие переменные могут быть установлены неявно как деталь реализации интерпретатора).__name__устанавливается в run_name, если этот необязательный аргумент неNone, и в'<run_path>'в противном случае.Если указанный путь непосредственно ссылается на файл скрипта (будь то исходный код или предварительно скомпилированный байткод), тогда
__file__устанавливается в переданный путь, а__spec__,__cached__,__loader__и__package__устанавливаются вNone.Если указанный путь ссылается на допустимый элемент sys.path, тогда
__spec__устанавливается соответствующим образом для импортированного модуля__main__(то есть,__spec__.nameвсегда будет__main__).__file__,__cached__,__loader__и__package__устанавливаются обычным образом на основе спецификации модуля.Также вносится ряд изменений в модуль
sys. Во-первых,sys.pathможет быть изменён, как описано выше.sys.argv[0]обновляется значениемfile_path, аsys.modules[__name__]обновляется временным объектом модуля для выполняемого модуля. Все изменения элементов в модулеsysотменяются до возврата функции.Обратите внимание, что в отличие от
run_module(), изменения, внесённые вsys, в этой функции не являются необязательными, так как эти корректировки необходимы для выполнения элементов sys.path. Поскольку ограничения потоковой безопасности всё ещё действуют, использование этой функции в потоковой коде должно быть либо сериализовано с блокировкой импорта, либо делегировано в отдельный процесс.См. также
Опции интерфейса для аналогичной функциональности в командной строке (
python path/to/script).Введено в версии 3.2.
Изменено в версии 3.4: Обновлено для использования возможности спецификации модуля, добавленной PEP 451. Это позволяет правильно установить
__cached__в случае, когда__main__импортируется из допустимого элемента sys.path, а не выполняется непосредственно.
См. также
- PEP 338 – Выполнение модулей как скриптов
-
PEP написан и реализован Ником Когланом.
- PEP 366 – Явные относительные импорты основного модуля
-
PEP написан и реализован Ником Когланом.
- PEP 451 – Тип ModuleSpec для системы импорта
-
PEP написан и реализован Эриком Сноу
Командная строка и среда - Подробности командной строки CPython
Функция importlib.import_module()
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/runpy.html