Itsmycode |
Иногда импорт модуля может вызвать слишком много разочарования, если вы новичок в Python. Этот урок узнает, как работает импорт, и решение для Importerror: Попытка относительного импорта без известного родительского пакета.
Прежде чем попасть в решение, давайте впервые поймем несколько основных терминологий в Python.
Модуль Python: Модуль – это файл в Python, содержащий определения и операторы. A модуль может содержать исполняемые операторы, а также определения функций. Проще говоря, подумайте как один файл .py с некоторыми функциональными возможностями.
Пакет Python: Пакет Python состоит из одного или нескольких модулей, и он содержит один файл с именем __init__.py
Это говорит Python, что этот каталог является пакетом. Файл инициирования может быть пустым, или он может включать код, который будет выполняться при инициализации пакета.
Импорт: Импорт в Python важны для эффективной структурирования вашего кода и с использованием * импорт * Ключевое слово, вы можете импортировать любой модуль и эффективно использовать его. Существует два типа импорта, относительно и абсолютных, которые будут выглядеть глубокими.
Давайте рассмотрим простой пример.
└── myproject ├── firstpackage │ ├── a.py └── secondpackage ├── b.py ├── c.py └── subpackage └── d.py
Вышеуказанный проект имеет два пакета с именем FirstPackage и Второй упаковка . Каждый из них содержит несколько модулей, и SecondPackage также имеет Subpackage Это включает в себя свой собственный модуль. Как правило, структура проекта идет примерно так, и она может стать довольно сложной.
Как работает импорт модуля в Python?
Теперь скажем, если вы импорт модуль B В одном из ваших файлов с помощью оператора импорта, как показано ниже.
import b
Python выполнит следующие операции для импорта модуля:
- Найдите, загрузите и инициализируйте (если требуется) запрошенный модуль
- Определить необходимые имена в местном пространстве имен и соответствующие объем
Теперь интерпретатор Python собирается выполнить следующие шаги в попытке разрешить модуль B.
Шаг 1: sys.modules уважать
Python попытается сначала посмотреть на модуль в sys.modules
, который представляет собой словарь, который имеет картирование пар клавишных значений модулей. Если он находит, то модуль разрешается и загружается.
Шаг 2: Стандартный поиск библиотеки Python
Стандартная библиотека Python Содержит встроенные модули (написанные в C), которые обеспечивают доступ к системной функциональности, такие как файл ввода/вывода, которые в противном случае были бы недоступны для программистов Python. Модули написаны на Python, который предоставляет стандартизированные решения для многих проблем, возникающих в повседневном программировании. Некоторые из этих модулей явно предназначены для поощрения и повышения мобильности программ Python путем абстрагирования спецификов для платформы в API-интеллектуальные платформы.
Если имя не найдено в sys.modules
, он будет искать в стандартной библиотеке. Если он не может найти там, то это идет на следующий шаг.
Шаг 3: Sys.path уважать
Python будет рассматривать Sys.path как последний шаг для разрешения модуля. Вот где все может пойти не так, и вы получите ModulenotFoundError: нет модуля с именем «B»
Абсолют против относительного импорта
В абсолютном импорте вам необходимо указать явный путь из корневого каталога проекта.
Пример – Если нам нужно импорт модуль B тогда мы можем использовать следующий способ импорта
import secondpackage.b
Другие способы импорта модулей в Python
# importing modules a.py import secondpackage.subpackage.d import secondpackage.c
В случае относительного импорта нам необходимо указать путь модуля относительно местоположения текущего модуля.
Пример –
# in module a.py from ..secondpackage import b from ..secondpackage.b import another_function # in module b from . import c from .c import my_function
Как исправить Importerror: попытка относительного импорта без известного родительского пакета?
Вариант 1 – Используйте абсолютный импорт
Например, структура каталога может быть следующей
. ├── project │ ├── package │ │ ├── __init__.py │ │ ├── module.py │ │ └── standalone.py │ └── setup.py
где setup.py является
from setuptools import setup, find_packages setup( name = 'your_package_name', packages = find_packages(), )
Вариант 2 – избавиться от ключевого слова
Удалите ключевое слово от From и используйте стандартный способ импорта, как показано ниже.
import secondpackage.c
Вариант 3 – Импорт внутри пакета
Поместите это в файл вашего пакета __init__.py :
# For relative imports to work in Python 3.6 import os, sys; sys.path.append(os.path.dirname(os.path.realpath( __file__ )))
Предполагая, что ваш пакет такой:
├── project │ ├── package │ │ ├── __init__.py │ │ ├── module1.py │ │ └── module2.py │ └── setup.py
Теперь используйте регулярный импорт в своем пакете, например:
# in module2.py from module1 import class1
Пост Importerror: попытка относительного импорта без известного родительского пакета появился первым на Itsmycode Анкет
Оригинал: “https://dev.to/itsmycode/importerror-attempted-relative-import-with-no-known-parent-package-1l3o”