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__(например, архив zip с файлом верхнего уровня__main__.py).Для простого скрипта указанный код выполняется в новом пространстве имён модуля. Для записи в sys.path (обычно архив zip или каталог) запись сначала добавляется в начало
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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/runpy.html