Как Python обрабатывает подпакеты? - PullRequest
3 голосов
/ 11 февраля 2020

Скажите Ansible был установлен с помощью "pip install ansible". Сразу после установки выполняется следующий оператор импорта:

from ansible.module_utils.basic import AnsibleModule

Теперь создается локальный пакет с именем "ansible .module_utils.custom". Структура каталогов:

 ansible/
   __init__.py
   module_utils/
     __init__.py
     custom/
       __init__.py
       utils.py

Как только это введено в действие, вышеупомянутый оператор импорта завершается неудачно. Утверждение "basi c" не определено. Локальный пакет действительно не объявляет подпакет "basi c". Только установленная библиотека Ansible. Кажется, Python ограничил свой поиск только локальным пакетом.

У меня сложилось впечатление, что Python рассмотрит полный путь к системе, прежде чем бросить поиск кода. То, что он вернется из локального пакета и, наконец, попадет в установленную библиотеку Ansible.

Это неверное предположение? Если да, возможно ли вообще заставить локальный пакет сосуществовать с установленным пакетом?

1 Ответ

0 голосов
/ 11 февраля 2020

Как работает импорт

import abc

Первое, что сделает Python, это поиск имени ab c в sys.modules. Это кэш всех модулей, которые были ранее импортированы.

Если имя не найдено в кеше модулей, Python продолжит поиск в списке встроенных модулей. Это модули, которые предустановлены с Python и находятся в стандартной библиотеке Python. Если имя все еще не найдено во встроенных модулях, Python затем ищет его в списке каталогов, определенных sys.path. Этот список обычно включает текущий каталог, который ищется первым.

Когда Python находит модуль, он связывает его с именем в локальной области видимости. Это означает, что ab c теперь определено и может использоваться в текущем файле без выброса NameError.

Если имя не найдено, вы получите ModuleNotFoundError. Вы можете узнать больше об импорте в Python документации здесь !

...