runpy
— Поиск и выполнение модулей Python¶
Kod źródłowy: 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 может использоваться для предварительного заполнения словаря глобальных переменных модуля перед выполнением кода. init_globals не будет изменен. Если какие-либо из приведенных ниже специальных глобальных переменных определены в init_globals, эти определения переопределяются
run_module()
.Специальные глобальные переменные
__name__
,__spec__
,__file__
,__cached__
,__loader__
и__package__
устанавливаются в словаре глобальных переменных перед кодом модуля. казнен. (Обратите внимание, что это минимальный набор переменных — другие переменные могут быть установлены неявно в качестве детали реализации интерпретатора.)__name__
встановлено на run_name, якщо цей необов’язковий аргумент не єNone
, наmod_name + '.__main__
, якщо названий модуль є пакетом, і на аргумент mod_name в іншому випадку .__spec__
будет установлен соответствующим образом для фактически импортированного модуля (т.е.__spec__.name
всегда будет mod_name илиmod_name + '.__main__'
, никогда run_name) .__file__
,__cached__
,__loader__
і__package__
встановлені як звичайні на основі специфікації модуля.Якщо вказано аргумент alter_sys і він має значення
True
, тодіsys.argv[0]
оновлюється значенням__file__
іsys.modules[__name__]
оновлюється тимчасовим об’єктом модуля для модуля, що виконується. Іsys.argv[0]
, іsys.modules[__name__]
відновлюються до своїх початкових значень перед поверненням функції.Обратите внимание, что эта манипуляция с
sys
не является потокобезопасной. Другие потоки могут видеть частично инициализированный модуль, а также измененный список аргументов. Рекомендуется оставлять модульsys
в покое при вызове этой функции из многопоточного кода.Zobacz także
Опція
-m
пропонує еквівалентні функції з командного рядка.Zmienione w wersji 3.1: Добавлена возможность запускать пакеты путем поиска подмодуля
__main__
.Zmienione w wersji 3.2: Додано глобальну змінну
__cached__
(див. PEP 3147).Zmienione w wersji 3.4: Оновлено, щоб скористатися перевагами функції специфікації модуля, доданої PEP 451. Це дозволяє правильно встановити
__cached__
для модулів, що запускаються таким чином, а також гарантує, що справжня назва модуля завжди доступна як__spec__.name
.Zmienione w wersji 3.12: Настройки
__cached__
,__loader__
и__package__
устарели. См. альтернативы вModuleSpec
.
- runpy.run_path(path_name, init_globals=None, run_name=None)¶
Выполните код в указанном месте файловой системы и верните словарь глобальных переменных полученного модуля. Как и в случае с именем сценария, передаваемым в командную строку CPython, file_path может относиться к исходному файлу Python, скомпилированному файлу байт-кода или допустимой записи
sys.path
, содержащей модуль__main__
(например, zip-файл, содержащий файл__main__.py
верхнего уровня).Для простого сценария указанный код просто выполняется в новом пространстве имен модуля. Для допустимой записи
sys.path
(обычно это zip-файл или каталог) запись сначала добавляется в началоsys.path
. Затем функция ищет и выполняет модуль__main__
, используя обновленный путь. Обратите внимание, что не существует специальной защиты от вызова существующей записи__main__
, расположенной в другом месте вsys.path
, если в указанном месте нет такого модуля.Необязательный аргумент словаря init_globals может использоваться для предварительного заполнения словаря глобальных переменных модуля перед выполнением кода. init_globals не будет изменен. Если какие-либо из приведенных ниже специальных глобальных переменных определены в init_globals, эти определения переопределяются с помощью
run_path()
.Специальные глобальные переменные
__name__
,__spec__
,__file__
,__cached__
,__loader__
и__package__
устанавливаются в словаре глобальных переменных перед кодом модуля. казнен. (Обратите внимание, что это минимальный набор переменных — другие переменные могут быть установлены неявно в качестве детали реализации интерпретатора.)__name__
встановлено на run_name, якщо цей необов’язковий аргумент не єNone
, і на' <run_path> ''
в іншому випадку.Если file_path напрямую ссылается на файл сценария (как исходный код, так и предварительно скомпилированный байт-код), то для
__file__
будет установлено значение file_path, а для__spec__
,__cached__
,__loader__ `` и ``__package__
будут установлены наNone
.Если file_path является ссылкой на действительную запись
sys.path
, то__spec__
будет установлен соответствующим образом для импортированного модуля__main__
(то есть__spec__.name` ` всегда будет ``__main__
).__file__
,__cached__
,__loader__
и__package__
будут установлены как обычные на основе спецификации модуля.Ряд изменений также внесен в модуль
sys
. Во-первых,sys.path
можно изменить, как описано выше.sys.argv[0]
обновляется значением file_path, аsys.modules[__name__]
обновляется временным объектом модуля для исполняемого модуля. Все изменения элементов вsys
отменяются до возврата функции.Обратите внимание, что, в отличие от
run_module()
, изменения, внесенные вsys
, не являются обязательными в этой функции, поскольку эти настройки необходимы для разрешения выполнения записейsys.path
. Поскольку ограничения потокобезопасности по-прежнему применяются, использование этой функции в многопоточном коде должно быть либо сериализовано с блокировкой импорта, либо делегировано отдельному процессу.Zobacz także
Interface options для еквівалентної функції в командному рядку (
python path/to/script
).Dodane w wersji 3.2.
Zmienione w wersji 3.4: Обновлено, чтобы использовать преимущества функции спецификации модуля, добавленной PEP 451. Это позволяет правильно установить
__cached__
в случае, когда__main__
импортируется из допустимой записиsys.path
, а не выполняется напрямую.Zmienione w wersji 3.12: Настройки
__cached__
,__loader__
и__package__
устарели.
Zobacz także
- PEP 338 – Виконання модулів як скриптів
PEP ditulis dan diimplementasi oleh Nick Coghlan.
- PEP 366 – Явний відносний імпорт основного модуля
PEP ditulis dan diimplementasi oleh Nick Coghlan.
- PEP 451 – Тип ModuleSpec для системи імпорту
PEP написав і реалізував Ерік Сноу
Command line and environment - деталі командного рядка CPython
Функція importlib.import_module()