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)¶ Выполнить код указанного модуля и вернуть результирующий словарь globals модуля. Код модуля сначала находится с помощью стандартного механизма импорта (подробности см. в PEP 302), а затем выполняется в свежем пространстве имен модуля.
Аргумент mod_name должен быть абсолютным именем модуля. Если имя модуля относится к пакету, а не к обычному модулю, то этот пакет импортируется, затем выполняется подмодуль
__main__внутри этого пакета и возвращается словарь глобальных данных модуля.Необязательный аргумент словаря init_globals может быть использован для предварительного заполнения словаря globals модуля перед выполнением кода. Предоставленный словарь не будет изменен. Если какая-либо из специальных глобальных переменных, описанных ниже, определена в предоставленном словаре, то эти определения отменяются аргументом
run_module().Специальные глобальные переменные
__name__,__spec__,__file__,__cached__,__loader__и__package__устанавливаются в словаре globals перед выполнением кода модуля (Обратите внимание, что это минимальный набор переменных - другие переменные могут быть установлены неявно, как деталь реализации интерпретатора).__name__устанавливается в run_name, если этот дополнительный аргумент неNone, вmod_name + '.__main__', если именованный модуль является пакетом, и в аргумент mod_name в противном случае.__spec__будет установлен соответствующим образом для фактически импортированного модуля (то есть__spec__.nameвсегда будет mod_name илиmod_name + '.__main__, никогда run_name).__file__,__cached__,__loader__и__package__являются set as normal на основе спецификации модуля.Если аргумент 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(path_name, init_globals=None, run_name=None)¶ Выполнить код в указанном месте файловой системы и вернуть результирующий словарь globals модуля. Как и в случае с именем скрипта, введенным в командную строку CPython, указанный путь может ссылаться на исходный файл Python, скомпилированный файл байткода или действительный элемент sys.path, содержащий модуль
__main__(например, zip-файл, содержащий файл верхнего уровня__main__.py).Для простого сценария указанный код просто выполняется в свежем пространстве имен модуля. Для действительного элемента sys.path (обычно это zip-файл или каталог), элемент сначала добавляется в начало
sys.path. Затем функция ищет и выполняет модуль__main__, используя обновленный путь. Обратите внимание, что нет никакой специальной защиты от вызова существующего модуля__main__, расположенного в другом месте наsys.path, если в указанном месте нет такого модуля.Необязательный аргумент словаря init_globals может быть использован для предварительного заполнения словаря globals модуля перед выполнением кода. Предоставленный словарь не будет изменен. Если какая-либо из специальных глобальных переменных, описанных ниже, определена в предоставленном словаре, то эти определения отменяются аргументом
run_path().Специальные глобальные переменные
__name__,__spec__,__file__,__cached__,__loader__и__package__устанавливаются в словаре globals перед выполнением кода модуля (Обратите внимание, что это минимальный набор переменных - другие переменные могут быть установлены неявно, как деталь реализации интерпретатора).__name__устанавливается в run_name, если этот дополнительный аргумент неNone, и в'<run_path>'в противном случае.Если указанный путь напрямую ссылается на файл сценария (как исходный текст или как предварительно скомпилированный байт-код), то
__file__будет установлен на указанный путь, а__spec__,__cached__,__loader__и__package__будут установлены наNone.Если указанный путь является ссылкой на действительный элемент sys.path, то
__spec__будет установлен соответствующим образом для импортированного модуля__main__(то есть__spec__.nameвсегда будет__main__).__file__,__cached__,__loader__и__package__будут set as normal в зависимости от спецификации модуля.В модуль
sysтакже вносится ряд изменений. Во-первых,sys.pathможет быть изменен, как описано выше.sys.argv[0]обновляется значениемpath_nameи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()