31.7. runpy – Поиск и выполнение модулей Python¶runpy – Locating and executing Python modules
Новое в версии 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