При импорте модуля/пакета, Python последовательно просматривает следующие места:
sys.path
: Список каталогов, где Python ищет модули. Включает:
PYTHONPATH
./usr/lib/python3.x/site-packages
).Python просматривает каждый каталог в sys.path
в порядке его появления. Если модуль найден, он загружается и выполняется. Если модуль не найден нигде, возникает исключение ModuleNotFoundError
(или ImportError
в старых версиях Python).
Механизм поиска модулей и пакетов в Python – это процесс, с помощью которого интерпретатор Python находит и загружает необходимые файлы для выполнения import
операторов. Этот процесс происходит в определенной последовательности, позволяя Python находить модули, как из стандартной библиотеки, так и из сторонних источников.
Порядок поиска модулей:
sys.modules
: Python сначала проверяет словарь sys.modules
. Этот словарь содержит уже загруженные модули. Если модуль был импортирован ранее, Python использует его непосредственно из sys.modules
, избегая повторной загрузки с диска. Это оптимизирует производительность.sys.path
: Если модуля нет в sys.modules
, Python переходит к поиску в списке путей, содержащемся в sys.path
. sys.path
представляет собой список строк, представляющих каталоги. Python последовательно просматривает каждый каталог в sys.path
, пытаясь найти файл модуля.Содержимое sys.path
:
sys.path
обычно инициализируется следующим образом:
python my_script.py
), то каталог, в котором находится my_script.py
, добавляется в sys.path
. Если Python запущен в интерактивном режиме, этот каталог может быть пустым.PYTHONPATH
: Содержимое переменной окружения PYTHONPATH
(если она установлена). PYTHONPATH
– это список каталогов, разделенных разделителем (например, :
в Unix-подобных системах и ;
в Windows)./usr/lib/python3.x/
). Этот путь определяется во время установки Python.Поиск файлов модулей:
При поиске модуля my_module
, Python ищет файлы со следующими расширениями и в следующем порядке:
my_module.py
: Стандартный исходный файл Python.my_module.pyc
или my_module.pyo
: Скомпилированные байт-коды (.pyc
создается автоматически, .pyo
создается с опцией -O
или -OO
).my_module.so
, my_module.pyd
, и т.д.: Разделяемые библиотеки (расширения для C, C++ и других языков).my_module
является пакетом (каталогом), то Python ищет файл __init__.py
внутри этого каталога. Наличие __init__.py
сигнализирует Python, что данный каталог следует рассматривать как пакет.Работа с пакетами:
Пакет – это способ организации связанных модулей в иерархическую структуру каталогов. Каждый подкаталог в пакете также может быть пакетом, если он содержит файл __init__.py
.
Например, для импорта модуля module_a
из пакета package_x
, структура каталогов может быть следующей:
package_x/ __init__.py module_a.py
В Python коде:
import package_x.module_a
Важно:
sys.path
имеет значение. Python ищет модули в том порядке, в котором каталоги перечислены в sys.path
.Этот механизм обеспечивает гибкость и позволяет Python легко находить и использовать модули из различных источников, что является одной из ключевых особенностей языка.