runpy — Поиск и выполнение модулей Python
Новое в версии 2.5.
Исходный код: Lib/runpy.py
Модуль runpy используется для поиска и выполнения модулей Python без их предварительного импорта. Его основное применение — реализация командной строки -m, которая позволяет искать скрипты в пространстве имён модулей Python вместо файловой системы.
Модуль runpy предоставляет две функции:
-
runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False) -
Выполняет код указанного модуля и возвращает словарь глобальных переменных результата. Сначала код модуля ищется стандартным механизмом импорта (см. PEP 302 для деталей), а затем выполняется в новом пространстве имён модуля.
Если имя переданного модуля относится к пакету, а не к обычному модулю, то этот пакет импортируется, а затем выполняется подмодуль
__main__в этом пакете, и возвращается полученный словарь глобальных переменных.Необязательный аргумент init_globals может использоваться для предварительной заполнения словаря глобальных переменных модуля перед выполнением кода. Переданный словарь не будет изменён. Если в переданном словаре определены какие-либо специальные глобальные переменные ниже, эти определения переопределяются функцией
run_module().Специальные глобальные переменные
__name__,__file__,__loader__и__package__устанавливаются в словаре глобальных переменных перед выполнением кода модуля (Обратите внимание, что это минимальный набор переменных — другие переменные могут устанавливаться неявно как деталь реализации интерпретатора).__name__устанавливается в run_name, если этот необязательный аргумент не равенNone, вmod_name + '.__main__'если указанный модуль является пакетом и в mod_name в противном случае.__file__устанавливается в имя, предоставленное загрузчиком модуля. Если загрузчик не предоставляет информацию о файле, эта переменная устанавливается вNone.__loader__устанавливается в загрузчик модулей PEP 302, используемый для получения кода модуля (Этот загрузчик может быть оболочкой вокруг стандартного механизма импорта).__package__устанавливается в mod_name, если указанный модуль является пакетом, и вmod_name.rpartition('.')[0]в противном случае.Если аргумент alter_sys передан и имеет значение
True, тоsys.argv[0]обновляется значением__file__, аsys.modules[__name__]обновляется временным объектом модуля для выполняемого модуля. Обаsys.argv[0]иsys.modules[__name__]восстанавливаются до своих исходных значений до возврата функции.Обратите внимание, что это изменение модуля
sysне является потокобезопасным. Другие потоки могут увидеть частично инициализированный модуль, а также изменённый список аргументов. Рекомендуется не трогать модульsysпри вызове этой функции из потоковой кода.См. также
Опция
-m, предлагающая эквивалентную функциональность из командной строки.Изменено в версии 2.7: Добавлена возможность выполнения пакетов путём поиска подмодуля
__main__
-
runpy.run_path(file_path, 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__,__file__,__loader__и__package__устанавливаются в словарь глобальных переменных перед выполнением кода модуля (Обратите внимание, что это минимальный набор переменных — другие переменные могут устанавливаться неявно как деталь реализации интерпретатора).__name__устанавливается в run_name, если этот необязательный аргумент не равенNone, и в'<run_path>'в противном случае.__file__устанавливается в имя, предоставленное загрузчиком модуля. Если загрузчик не предоставляет информацию о файле, эта переменная устанавливается вNone. Для простого скрипта это значение будетfile_path.__loader__устанавливается в загрузчик модулей PEP 302, используемый для получения кода модуля (Этот загрузчик может быть оболочкой вокруг стандартного механизма импорта). Для простого скрипта это значение будетNone.__package__устанавливается в__name__.rpartition('.')[0].Также вносится ряд изменений в модуль
sys. Во-первых,sys.pathможет быть изменён как описано выше.sys.argv[0]обновляется значениемfile_path, аsys.modules[__name__]обновляется временным объектом модуля для выполняемого модуля. Все изменения элементов вsysотменяются до возврата функции.Обратите внимание, что в отличие от
run_module(), изменения, внесенные вsys, являются необязательными в этой функции, поскольку эти корректировки необходимы для выполнения записей sys.path. Поскольку ограничения потоковой безопасности по-прежнему действуют, использование этой функции в потоковой коде должно быть либо сериализовано с помощью блокировки импорта, либо делегировано в отдельный процесс.См. также
Параметры интерфейса для эквивалентной функциональности в командной строке (
python path/to/script).Новое в версии 2.7.
См. также
- PEP 338 — Выполнение модулей как скриптов
-
PEP написан и реализован Ником Коглэном.
- PEP 366 — Явные относительные импорты основного модуля
-
PEP написан и реализован Ником Коглэном.
Командная строка и среда — Подробности командной строки CPython
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/runpy.html