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__.py
zip-файл, содержащий <<< верхний уровень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()