Проблема с импортом из текущей директории

Стараюсь изучить импорт модулей python. Но недавно столкнулся с проблемой при импорте модуля из текущей директории. Директория выглядит так:

- source.py
- src.py

В файле src.py хранятся данные, которые я собираюсь собирать оттуда в файле source.py. Я пишу:

from . import src

Возникает ошибка:

  from . import src
ImportError: attempted relative import with no known parent package

В чём ошибка? Что я делаю не так?


Ответы (2 шт):

Автор решения: insolor

Вкратце: замените from . import src на import src.

Импорт через точку - это относительный импорт. Относительный импорт работает только внутри пакетов, при этом такой импорт будет работать только если source.py импортирован из пакета, а не запущен или импортирован как отдельный модуль. К примеру, имеем такую структуру файлов:

+-module.py
+-sources
  +-source.py
  +-src.py

Директория sources при этом является пакетом, несмотря на отсутствие файла __init__.py (начиная с Python 3.3 его наличие стало необязательным, см. PEP 420 -- Implicit Namespace Packages).

Дальше:

  • В модуле module.py одна строка: from sources.source import *
  • В source.py одна строка: from . import src
  • В src.py: print("Hello from src.py!")

Запускаем: python3 module.py

Вывод: Hello from src.py!

Если перейти в sources и запустить python3 source.py, то будет такая ошибка:

Traceback (most recent call last):
  File "/home/.../sources/source.py", line 1, in <module>
    from . import src
ImportError: attempted relative import with no known parent package

Перевод - "попытка относительного импорта при неизвестном родительском пакете". Аналогичная ошибка будет, если попытаться импортировать source.py напрямую с помощью import source.


Таким образом, у вас два варианта:

  • вынести ваши файлы в пакет, тогда можно будет использовать относительный импорт (придется его использовать импорта для модулей в этом же пакете, т.е. импорт вида import src или from src import ... из модуля того же пакета работать не будет)
  • либо не выносить в пакет, и использовать обычный абсолютный импорт.
→ Ссылка
Автор решения: Kers

Дополню немного. В Вашем случае просто не используйте относительный импорт через
from . import src
а замените его на:
import src

P.S. И да наличие файлов __init__.py желательно но не обязательно.

→ Ссылка