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()
