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__внутри этого пакета и возвращается результирующий словарь глобальных параметров модуля.Необязательный аргумент dictionary 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__являются set as normal на основе спецификации модуля.Если указан аргумент alter_sys, значение которого равно
True, тоsys.argv[0]обновляется значением__file__, аsys.modules[__name__]обновляется временным объектом module для выполняемого модуля. Как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)¶
Выполните код в указанном расположении файловой системы и верните результирующий словарь глобальных параметров модуля. Как и в случае с именем скрипта, указанным в командной строке CPython, указанный путь может относиться к исходному файлу Python, скомпилированному файлу байт-кода или допустимой записи
sys.path, содержащей модуль__main__(например,__main__.pyzip-файл, содержащий <<< верхний уровень2>>> файл).Для простого скрипта указанный код просто выполняется в новом пространстве имен модуля. Для допустимой записи
sys.path(обычно это zip-файл или каталог) запись сначала добавляется в началоsys.path. Затем функция ищет и запускает модуль__main__, используя обновленный путь. Обратите внимание, что нет специальной защиты от вызова существующей записи__main__, расположенной в другом месте наsys.path, если в указанном месте такого модуля нет.Необязательный аргумент dictionary init_globals может быть использован для предварительного заполнения словаря глобальных переменных модуля перед выполнением кода. Предоставленный словарь не будет изменен. Если какая-либо из приведенных ниже специальных глобальных переменных определена в прилагаемом словаре, эти определения переопределяются значением
run_path().Специальные глобальные переменные
__name__,__spec__,__file__,__cached__,__loader__и__package__задаются в словаре глобальных переменных перед выполнением кода модуля (Обратите внимание, что это минимальный набор переменных - другие переменные могут быть заданы неявно в качестве детали реализации интерпретатора).__name__присваивается значение имя_исполнителя, если этот необязательный аргумент не равенNone, и значение'<run_path>'в противном случае.Если указанный путь напрямую ссылается на файл скрипта (будь то исходный код или предварительно скомпилированный байт-код), то для
__file__будет установлен указанный путь, а для__spec__,__cached__,__loader__и__package__будут установлены значенияNone.Если указанный путь является ссылкой на допустимую запись
sys.path, то для импортируемого модуля__main__будет соответствующим образом установлен__spec__(то есть__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.
См.также
- PEP 338 – Выполнение модулей в виде скриптов
PEP, написанный и реализованный Ником Когланом.
- PEP 366 – Явный относительный импорт основного модуля
PEP, написанный и реализованный Ником Когланом.
- PEP 451 – Тип спецификации модуля для системы импорта
PEP, написанный и реализованный Эриком Сноу
Командная строка и окружающая среда - Сведения о командной строке Python
Функция importlib.import_module()