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 может быть используемый, чтобы предварительно населить globals словарь модуля перед код, выполнен. Предоставленный словарь не будет изменен. Если какая-либо из указанных ниже специальных глобальных переменных определена в предоставленном словаре, эти определения переопределяются
run_module()
.Специальные глобальные переменные
__name__
,__spec__
,__file__
,__cached__
,__loader__
и__package__
установлены в globals словаре перед модулем код, выполнены (Обратите внимание, что это - минимальный набор переменных - другие переменные могут быть установлены неявно как деталь внедрения интерпретатор).__name__
установлен в run_name, если этот дополнительный аргумент неNone
вmod_name + '.__main__'
, если названный модуль - пакет и к аргументу mod_name иначе.__spec__
будет установлен соответственно для импортированного модуля фактически (то есть,__spec__.name
всегда будет mod_name илиmod_name + '.__main__
, никогда run_name).__file__
,__cached__
,__loader__
и__package__
- установить как обычно на основе модуля spec.Если аргумент 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: Обновленный, чтобы использовать в своих интересах модуль опция spec, добавленная PEP 451. Это позволяет
__cached__
быть установленным правильно для модулей, управляют этим путем, а также обеспечение реального имени модуля всегда доступно как__spec__.name
.
-
runpy.
run_path
(file_path, init_globals=None, run_name=None)¶ Выполните код в названном местоположении файловой системы и возвращает получающийся модуль globals словарь. Как и в случае имени сценария, предоставленного в командную строку CPython, предоставленный путь может относиться к исходному файлу Python, скомпилированному файлу байт-кода или допустимой записи sys.path, содержащей модуль
__main__
(например, zipfile, содержащий файл__main__.py
верхнего уровня).Для простого сценария указанный код просто выполняется в пространстве имен нового модуля. Для допустимой записи sys.path (обычно zipfile или каталог) запись сначала добавляется в начало
sys.path
. Затем функция выполняет поиск и выполнение модуля__main__
с использованием обновленного пути. Следует отметить, что нет специальной защиты от вызова существующей записи__main__
, расположенной в другом месте наsys.path
, если в указанном месте нет такого модуля.Дополнительный аргумент словаря init_globals может быть используемый, чтобы предварительно населить globals словарь модуля перед код, выполнен. Предоставленный словарь не будет изменен. Если какая-либо из указанных ниже специальных глобальных переменных определена в предоставленном словаре, эти определения переопределяются
run_path()
.Специальные глобальные переменные
__name__
,__spec__
,__file__
,__cached__
,__loader__
и__package__
установлены в globals словаре перед модулем код, выполнены (Обратите внимание, что это - минимальный набор переменных - другие переменные могут быть установлены неявно как деталь внедрения интерпретатор).__name__
установлен в run_name, если этот дополнительный аргумент неNone
и в'<run_path>'
иначе.Если предоставленный путь непосредственно ссылается на файл сценария (либо в качестве исходного, либо в качестве предварительно скомпилированного байта код), то
__file__
будет установлен на предоставленный путь, а__spec__
,__cached__
,__loader__
и__package__
будут установлены наNone
.Если снабженный путь будет ссылкой на действительный sys.path вход, то
__spec__
будет установлен соответственно для импортированного модуля__main__
(то есть,__spec__.name
всегда будет__main__
).__file__
,__cached__
,__loader__
и__package__
будут установить как обычно на основе модуля spec.В модуль
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: Обновленный, чтобы использовать в своих интересах модуль опция spec, добавленная PEP 451. Это позволяет
__cached__
быть установленным правильно в случае, куда__main__
импортирован из действительного sys.path входа вместо того, чтобы быть выполненным непосредственно.
См.также
- PEP 338 – выполнение модулей в виде сценариев
- PEP, написанных и реализованных Nick Coghlan.
- PEP 366 – основной модуль явный относительный импорт
- PEP, написанный и реализованный Nick Coghlan.
- PEP 451 – тип спецификации модуля для системы импорта
- PEP, написанный и реализованный Eric Snow
Командная строка и среда - CPython сведения командной строки
Функция importlib.import_module()