Проблема с импортом из текущей директории
Стараюсь изучить импорт модулей 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,036 1 1 золотой знак 9 9 серебряных знаков 12 12 бронзовых знаков
задан 16 фев 2021 в 11:41
53 5 5 бронзовых знаков
рядом с src.py есть __init__.py ?
16 фев 2021 в 11:45
Как писали выше проверьте наличие файла __init__.py . Он указывает что данная директория является пакетом а не просто папкой с файлами.
16 фев 2021 в 11:51
Просто import src работает?
16 фев 2021 в 12:11
Связанный вопрос: Относительный импорт в Python 3
16 фев 2021 в 12:33
2 ответа 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 from . import src ImportError: attempted relative import with no known parent package
Перевод — «попытка относительного импорта при неизвестном родительском пакете». Аналогичная ошибка будет, если попытаться импортировать source.py напрямую с помощью import source .
Таким образом, у вас два варианта:
- вынести ваши файлы в пакет, тогда можно будет использовать относительный импорт (придется его использовать импорта для модулей в этом же пакете, т.е. импорт вида import src или from src import . из модуля того же пакета работать не будет)
- либо не выносить в пакет, и использовать обычный абсолютный импорт.
Импортирование файлов из разных папок в Python
Одной из распространенных проблем, с которой сталкиваются новички в Python, является импортирование функций или классов из файлов, расположенных в разных папках. Рассмотрим типичную ситуацию. Предположим, есть следующая структура папок и файлов:
проект ├── папка1 │ └── файл1.py └── папка2 └── файл2.py
В файле файл1.py определена функция func() , которую необходимо использовать в файл2.py . Первым, что приходит в голову, это попытаться импортировать функцию напрямую:
from проект.папка1.файл1 import func
Однако, это выдаст ошибку, потому что Python не сможет найти указанный модуль. Как же быть?
Правильное импортирование файлов из разных папок
Python использует переменную среды PYTHONPATH для определения, где искать модули для импорта. По умолчанию PYTHONPATH включает в себя текущую директорию (или директорию, откуда был запущен скрипт) и некоторые стандартные директории, где установлен Python.
Для решения проблемы необходимо добавить папку, содержащую нужный модуль, в PYTHONPATH . Если папка проекта является корневой директорией для всех модулей, ее следует добавить в PYTHONPATH .
Это можно сделать двумя способами:
1. Изменение PYTHONPATH
Добавьте путь к папке проекта в переменную среды PYTHONPATH . Это можно сделать в командной строке следующим образом:
export PYTHONPATH=$PYTHONPATH:/путь/к/папке/проекта
После этого Python сможет найти и импортировать модули из этой папки.
2. Добавление пути при помощи sys.path
Можно динамически добавить путь к папке проекта в список путей, где Python ищет модули. Это делается с помощью модуля sys :
import sys sys.path.append('/путь/к/папке/проекта')
Этот код необходимо добавить в начало файла файл2.py , прежде чем попытаться импортировать модуль из файл1.py .
Оба этих способа позволяют Python найти и импортировать модули из любой папки на компьютере. Однако, следует помнить, что изменение PYTHONPATH или sys.path влияет на все последующие операции импорта в текущем сеансе Python. Поэтому следует быть осторожным и избегать добавления путей, которые могут спровоцировать конфликты имен модулей.
Как импортировать файл в python из текущей папки
В случаях, когда в программу на Python необходимо импортировать пакет, находящийся в произвольной папке, можно воспользоваться добавлением пути к этой папке в список системных директорий c помощью sys.path.insert :
import sys sys.path.insert(1, 'path') import package_name
Для примера рассмотрим следующую структуру проекта:
project/ web/ app.py lib/ mylib.py
Для импорта mylib.py в app.py :
import sys sys.path.insert(1, '../lib') import mylib
Альтернативным способом является использование sys.path . Например, для добавления родительской папки:
import sys sys.path.append('..') import package_from_parent_dir
python import Импорт включение кода из другого файла — несколько файлов в проекте пример include
Предположим, что нам надо перенести некий класс (функционал) в другой файл (отдельный), а потом подключить его в главном файле проекта.
Предположим, что вы назвали файл, содержащий, например, этот класс, MainMatrix.py, тогда импортировать его можно так:
from MainMatrix import KtfMatrix
Включение из файловой иерархии — зная путь
Предположим в корне проекта у вас лежит главная папка библиотеки (mathone), а в ней уже подпапки и файлы разных классов в них, добавьте в каждую папку пустой файл (в том числе в корневую папку библиотеки) с именем:
__init__.py

Тогда это будет выглядеть как-то так:
Далее в точке входа в программу или вообще в любом использующем компоненты библиотеки коде (например main.py) мы можем сделать импорт конкретного класса из одного из файлов нашей библиотеки так:
from mathone.Matrix.MainMatrix import KtfMatrix
Или пример использования одним классом библиотеки (модуля/пакета) другого класса (с поднятием на уровень вверх по файловой иерархии [две точки ..] и назначением псевдонима) :
from ..Common.MathCommon import MathCommon as mc
(код из MainMatrix.py использует класс MathCommon из MathCommon .py)
Key Words for FKN + antitotal forum (CS VSU):
- python include file
- python импорт модуля из другой папки
- python автозагрузка классов
- python 3 __init__.py example
- python __init__.py пример использования — понятное объяснение
- python import by path
- python class autoload import from hierarhy
- python Как правильно организовать загрузку собтвенной библиотеки импорт класса файла из другой папки примеры
