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 может быть использован для предварительной инициализации словаря глобальных переменных модуля перед выполнением кода. init_globals не будет изменён. Если какие-либо из специальных глобальных переменных ниже определены в 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.Изменено в версии 3.12: Установка
__cached__,__loader__, и__package__устарела. См.ModuleSpecдля альтернатив.
-
runpy.run_path(path_name, init_globals=None, run_name=None) -
Выполните код по указанному пути в файловой системе и верните словарь глобальных переменных получившегося модуля. Как и в случае с именем скрипта, переданным в командную строку CPython, file_path может ссылаться на файл исходного кода Python, скомпилированный байт-код файл или допустимый
sys.pathзапись, содержащую__main__модуль (например, zipfile, содержащий файл верхнего уровня__main__.py).Для простого скрипта указанный код просто выполняется в новом пространстве имен модуля. Для допустимой записи в
sys.path(обычно zipfile или директория), запись сначала добавляется в началоsys.path. Затем функция ищет и выполняет__main__модуль с использованием обновленного пути. Обратите внимание, что нет особой защиты от вызова существующей__main__записи, расположенной в другом месте наsys.path, если такого модуля нет по указанному пути.Дополнительный аргумент init_globals может использоваться для предварительной заполнения словаря глобальных переменных модуля перед выполнением кода. init_globals не будет изменён. Если какие-либо из специальных глобальных переменных ниже определены в init_globals, эти определения переопределяются
run_path().Специальные глобальные переменные
__name__,__spec__,__file__,__cached__,__loader__и__package__устанавливаются в словаре глобальных переменных перед выполнением кода модуля. (Обратите внимание, что это минимальный набор переменных — другие переменные могут быть установлены неявно как деталь реализации интерпретатора.)__name__устанавливается в run_name, если этот необязательный аргумент неNone, и в'<run_path>'в противном случае.Если file_path напрямую ссылается на файл скрипта (будь то исходный код или предварительно скомпилированный байт-код), то
__file__будет установлено в file_path, а__spec__,__cached__,__loader__и__package__будут установлены вNone.Если file_path ссылается на допустимую запись в
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, а не выполняется непосредственно.Изменён в версии 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.13/library/runpy.html