Проблема с импортом из текущей директории
Стараюсь изучить импорт модулей 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 шт):
Вкратце: замените 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 ...из модуля того же пакета работать не будет) - либо не выносить в пакет, и использовать обычный абсолютный импорт.
Дополню немного.
В Вашем случае просто не используйте относительный импорт через
from . import src
а замените его на:
import src
P.S. И да наличие файлов __init__.py желательно но не обязательно.