07 Июл 2023
2 мин
587

Импорт файла из поддиректории в Python

В разработке программного обеспечения на Python часто возникает необходимость организовать код в разные файлы и директории для удобства и читаемости.

Содержание

В разработке программного обеспечения на Python часто возникает необходимость организовать код в разные файлы и директории для удобства и читаемости. Иногда появляется необходимость импортировать функции или классы из файла, который находится в поддиректории.

Например, есть файл main.py, который находится в директории project. В поддиректории lib этого проекта находится файл utils.py. Из main.py требуется импортировать функцию print_hello из utils.py.

В первую очередь может показаться, что это можно сделать так:

import lib.utils

Однако, при попытке запустить код возникает ошибка ImportError: No module named lib.utils.

Существует несколько способов решить данную проблему.

Создание файла __init__.py

Один из наиболее простых и распространённых способов — это создать пустой файл __init__.py в директории lib. Он сообщает Python, что lib — это пакет, и файлы внутри него могут быть импортированы.

После создания файла __init__.py в lib, импорт print_hello из utils.py может быть выполнен следующим образом:

from lib.utils import print_hello

Также можно импортировать весь файл utils.py и обращаться к функции print_hello через точку:

import lib.utils

lib.utils.print_hello()

Или можно импортировать весь файл utils.py под другим именем:

import lib.utils as u

u.print_hello()

Использование относительного импорта

Если файлы main.py и utils.py находятся в одном пакете, можно использовать относительный импорт.

from .lib.utils import print_hello

Здесь точка перед lib указывает на текущую директорию.

Использование sys.path

Ещё один способ — это добавить путь к необходимой директории в sys.path, который содержит список путей, где Python ищет модули при импорте.

import sys
sys.path.insert(0, '/путь/к/директории/lib')

import utils

Однако, этот способ следует использовать с осторожностью, поскольку он может привести к конфликтам имен модулей.

Содержание

Добавить комментарий

Определи профессию по рисунку