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