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