Документация Python неофициальный перевод

runpy.md

86 строк · 12.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/runpy.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 31.7. [`runpy`](https://python-all.ru/2.7/library/runpy.html#module-runpy) – Поиск и выполнение модулей Python89Новое в версии 2.5.1011**Исходный код:** [Lib/runpy.py](https://python-all.ru/src/2.7/Lib/runpy.py)1213---1415Модуль [`runpy`](https://python-all.ru/2.7/library/runpy.html#module-runpy) используется для поиска и запуска модулей Python без их предварительного импорта. Основное его применение – реализация ключа командной строки [`-m`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-m), который позволяет находить скрипты через пространство имён модулей Python, а не через файловую систему.1617Модуль [`runpy`](https://python-all.ru/2.7/library/runpy.html#module-runpy) предоставляет две функции:1819#### `runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)`2021Выполняет код указанного модуля и возвращает результирующий словарь глобальных переменных модуля. Сначала код модуля находится с помощью стандартного механизма импорта (подробнее см. [**PEP 302**](https://python-all.ru/2.7/library/runpy.html)), а затем выполняется в новом пространстве имён модуля.2223Если указанное имя модуля относится к пакету, а не к обычному модулю, то этот пакет импортируется, и в нём выполняется подмодуль `__main__`, после чего возвращается полученный словарь глобальных переменных модуля.2425Необязательный аргумент-словарь *init\_globals* можно использовать для предварительного заполнения словаря глобальных переменных модуля до выполнения кода. Переданный словарь не будет изменён. Если какие-либо из специальных глобальных переменных, перечисленных ниже, определены в переданном словаре, эти определения переопределяются вызовом [`run_module()`](https://python-all.ru/2.7/library/runpy.html#runpy.run_module).2627Специальные глобальные переменные `__name__`, `__file__`, `__loader__` и `__package__` устанавливаются в словаре глобальных переменных до выполнения кода модуля (обратите внимание, что это минимальный набор переменных – другие переменные могут устанавливаться неявно как деталь реализации интерпретатора).2829`__name__` устанавливается в *run\_name*, если этот необязательный аргумент не равен [`None`](https://python-all.ru/2.7/library/constants.html#None), в `mod_name + '.__main__'`, если указанный модуль является пакетом, и в аргумент *mod\_name* в противном случае.3031`__file__` устанавливается в имя, предоставленное загрузчиком модулей. Если загрузчик не предоставляет информацию об имени файла, эта переменная устанавливается в [`None`](https://python-all.ru/2.7/library/constants.html#None).3233`__loader__` устанавливается в [**PEP 302**](https://python-all.ru/2.7/library/runpy.html) загрузчик модулей, используемый для получения кода модуля (этот загрузчик может быть обёрткой стандартного механизма импорта).3435`__package__` устанавливается в *mod\_name*, если именованный модуль является пакетом, и в `mod_name.rpartition('.')[0]` в противном случае.3637Если аргумент *alter\_sys* передан и его значение равно [`True`](https://python-all.ru/2.7/library/constants.html#True), то `sys.argv[0]` обновляется значением `__file__`, а `sys.modules[__name__]` обновляется временным объектом модуля для выполняемого модуля. Оба `sys.argv[0]` и `sys.modules[__name__]` восстанавливаются до исходных значений перед возвратом из функции.3839Обратите внимание: такие манипуляции с [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys) не являются потокобезопасными. Другие потоки могут увидеть частично инициализированный модуль, а также изменённый список аргументов. Рекомендуется оставить модуль [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys) в покое при вызове этой функции из многопоточного кода.4041> **См. также**42>43> Параметр [`-m`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-m) предоставляет эквивалентную функциональность из командной строки.4445Изменено в версии 2.7: Добавлена возможность выполнения пакетов через поиск подмодуля `__main__`.4647#### `runpy.run_path(file_path, init_globals=None, run_name=None)`4849Выполняет код по указанному пути в файловой системе и возвращает словарь глобальных переменных модуля. Как и имя скрипта, переданное в командной строке CPython, переданный путь может указывать на исходный файл Python, скомпилированный байткод или валидный элемент sys.path, содержащий модуль `__main__` (например, zip-файл с файлом `__main__.py` верхнего уровня).5051Для простого скрипта указанный код просто выполняется в новом пространстве имён модуля. Для валидного элемента sys.path (обычно zip-файла или каталога) этот элемент сначала добавляется в начало `sys.path`. Затем функция ищет и выполняет модуль [`__main__`](https://python-all.ru/2.7/library/__main__.html#module-__main__), используя обновлённый путь. Обратите внимание, что нет специальной защиты от вызова существующего элемента [`__main__`](https://python-all.ru/2.7/library/__main__.html#module-__main__), расположенного в другом месте `sys.path`, если по указанному пути такого модуля нет.5253Необязательный аргумент-словарь *init\_globals* можно использовать для предварительного заполнения словаря глобальных переменных модуля до выполнения кода. Переданный словарь не будет изменён. Если какие-либо из специальных глобальных переменных, перечисленных ниже, определены в переданном словаре, эти определения переопределяются вызовом [`run_path()`](https://python-all.ru/2.7/library/runpy.html#runpy.run_path).5455Специальные глобальные переменные `__name__`, `__file__`, `__loader__` и `__package__` устанавливаются в словаре глобальных переменных до выполнения кода модуля (обратите внимание, что это минимальный набор переменных – другие переменные могут устанавливаться неявно как деталь реализации интерпретатора).5657`__name__` устанавливается в *run\_name*, если этот необязательный аргумент не равен [`None`](https://python-all.ru/2.7/library/constants.html#None), и в `'<run_path>'` в противном случае.5859`__file__` устанавливается в имя, предоставленное загрузчиком модулей. Если загрузчик не предоставляет информацию об имени файла, эта переменная устанавливается в [`None`](https://python-all.ru/2.7/library/constants.html#None). Для простого скрипта она будет установлена в `file_path`.6061`__loader__` устанавливается в [**PEP 302**](https://python-all.ru/2.7/library/runpy.html) загрузчик модулей, используемый для получения кода модуля (этот загрузчик может быть обёрткой стандартного механизма импорта). Для простого скрипта она будет установлена в [`None`](https://python-all.ru/2.7/library/constants.html#None).6263`__package__` устанавливается в `__name__.rpartition('.')[0]`.6465В модуль [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys) также вносится ряд изменений. Во-первых, `sys.path` может быть изменён, как описано выше. `sys.argv[0]` обновляется значением `file_path`, а `sys.modules[__name__]` обновляется временным объектом модуля для выполняемого модуля. Все изменения элементов в [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys) отменяются до возврата функции.6667Обратите внимание: в отличие от [`run_module()`](https://python-all.ru/2.7/library/runpy.html#runpy.run_module), изменения в [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys) в этой функции не являются необязательными, поскольку эти корректировки необходимы для обеспечения выполнения элементов sys.path. Поскольку по-прежнему действуют ограничения потокобезопасности, использование этой функции в многопоточном коде должно быть либо сериализовано с помощью блокировки импорта, либо перенесено в отдельный процесс.6869> **См. также**70>71> [Параметры интерфейса](https://python-all.ru/2.7/using/cmdline.html#using-on-interface-options) для эквивалентной функциональности в командной строке (`python path/to/script`).7273Новое в версии 2.7.7475> **См. также**76>77> **[**PEP 338**](https://python-all.ru/2.7/library/runpy.html) – Выполнение модулей как сценариев**78>79> PEP написан и реализован Ником Когланом.80>81> **[**PEP 366**](https://python-all.ru/2.7/library/runpy.html) – Явные относительные импорты главного модуля**82>83> PEP написан и реализован Ником Когланом.84>85> [Командная строка и окружение](https://python-all.ru/2.7/using/cmdline.html#using-on-general) – подробности о командной строке CPython86