8

Импорт модуля по относительному пути

1

Как импортировать модуль Python, зная его относительный путь?

У меня есть следующая структура каталогов:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

В файле Foo.py мне нужно импортировать модуль Bar.py, который находится в подкаталоге dirBar. Однако, у меня нет возможности изменить структуру каталогов.

Как правильно осуществить этот импорт?

5 ответ(ов)

3

Предполагая, что оба ваших каталога являются реальными пакетами Python (то есть содержат файл __init__.py), вот безопасное решение для включения модулей относительно расположения вашего скрипта.

Я предполагаю, что вы хотите сделать это, потому что вам нужно включить набор модулей вместе с вашим скриптом. Я использую это в продакшене в нескольких продуктах, и оно работает во многих особых сценариях, таких как: скрипты, вызываемые из другого каталога, или выполняемые с помощью команды python, а не открытия нового интерпретатора.

Вот пример кода:

import os, sys, inspect
# realpath() позволит вашему скрипту работать, даже если вы создаете символьную ссылку :)
cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile(inspect.currentframe()))[0]))
if cmd_folder not in sys.path:
    sys.path.insert(0, cmd_folder)

# Используйте это, если хотите включить модули из подпапки
cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile(inspect.currentframe()))[0], "subfolder")))
if cmd_subfolder not in sys.path:
    sys.path.insert(0, cmd_subfolder)

# Важно:
# cmd_folder = os.path.dirname(os.path.abspath(__file__)) # НЕ ИСПОЛЬЗУЙТЕ __file__ !!!
# __file__ не работает, если скрипт вызывается разными способами в Windows.
# __file__ может не сработать, если кто-то сделает os.chdir() перед этим.
# sys.argv[0] также может не сработать, потому что не всегда содержит путь.

В качестве бонуса, этот подход позволяет вам заставить Python использовать ваш модуль вместо установленных в системе.

Предостережение! Я не совсем уверен, что происходит, когда текущий модуль находится в файле egg. Вероятно, это тоже вызовет сбой.

3

Убедитесь, что в директории dirBar есть файл __init__.py — он превращает директорию в пакет Python.

2

Вы также можете добавить подпапку в ваш Python путь, чтобы импортировать её как обычный скрипт.

import sys
sys.path.insert(0, <путь к dirFoo>)
import Bar

Таким образом, вы сможете использовать модуль Bar, находящийся в подпапке dirFoo, без необходимости перемещения файлов. Не забудьте заменить <путь к dirFoo> на фактический путь к вашей директории.

1

Вы можете использовать следующий код для добавления пути к вашей библиотеке в sys.path, чтобы импортировать модуль mymodule. В этом примере мы используем os.path для построения абсолютного пути к директории lib, которая находится на три уровня вверх от текущего файла.

import os
import sys

# Получаем абсолютный путь к директории 'lib', который находится на три уровня вверх
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))

# Добавляем этот путь в sys.path, чтобы Python мог его найти
sys.path.append(lib_path)

# Теперь можно импортировать модуль mymodule
import mymodule

Убедитесь, что структура каталогов соответствует вашему проекту, и что lib действительно находится там, где вы ожидаете.

1

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

Предположим, у вас есть следующая структура каталогов:

lib/abc.py

Вам потребуется создать пустой файл в папке lib, называемый

__init__.py

После этого вы сможете использовать такой импорт:

from lib.abc import <Название вашего модуля>

Не забудьте оставить файл __init__.py в каждой папке иерархии импортируемого модуля. Это позволит Python распознавать директории как пакеты.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь