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, то значение__file__присваиваетсяsys.argv[0], а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.Изменено в версии 3.12: Назначение
__cached__,__loader__и__package__объявлено устаревшим. Альтернативные варианты см. вModuleSpec.
-
runpy.run_path(path_name, 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может быть изменён, как описано выше. Значениеpath_nameприсваиваетсяsys.argv[0], аsys.modules[__name__]присваивается временный объект модуля для выполняемого модуля. Все изменения элементов вsysотменяются до возврата функции.Обратите внимание: в отличие от
run_module(), измененияsysв этой функции необязательными не являются, поскольку эти настройки необходимы для выполнения элементовsys.path. Поскольку ограничения потокобезопасности сохраняются, при использовании этой функции в многопоточном коде её следует либо сериализовать с помощью блокировки импорта, либо выполнять в отдельном процессе.См. также
Параметры интерфейса — аналогичные возможности в командной строке (
python path/to/script).Добавлено в версии 3.2.
Изменено в версии 3.4: Обновлено с учётом поддержки спецификации модулей, добавленной в PEP 451. Благодаря этому
__cached__правильно устанавливается, когда__main__импортируется из действительного элементаsys.path, а не выполняется напрямую.Изменено в версии 3.12: Назначение
__cached__,__loader__и__package__объявлено устаревшим.
См. также
- PEP 338 — Выполнение модулей как скриптов
-
PEP, написанный и реализованный Ником Когланом.
- PEP 366 — Явный относительный импорт в главном модуле
-
PEP, написанный и реализованный Ником Когланом.
- PEP 451 — Тип ModuleSpec для системы импорта
-
PEP, написанный и реализованный Эриком Сноу.
Командная строка и окружение — подробности о командной строке CPython
Функция importlib.import_module()
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/runpy.html