Spec-Zone.ru › Python 2.7

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API