Рубрики
Без рубрики

Importerror: попытка относительного импорта без известного родительского пакета

Itsmycode | Импорт модуля иногда может вызвать слишком много разочарования, если вы новичок в Python …. Tagged с помощью Python, Programming, Codenewbie, Tuperial.

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”