Импорт модуля по относительному пути
Как импортировать модуль Python, зная его относительный путь?
У меня есть следующая структура каталогов:
dirFoo\
Foo.py
dirBar\
Bar.py
В файле Foo.py
мне нужно импортировать модуль Bar.py
, который находится в подкаталоге dirBar
. Однако, у меня нет возможности изменить структуру каталогов.
Как правильно осуществить этот импорт?
5 ответ(ов)
Предполагая, что оба ваших каталога являются реальными пакетами 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
. Вероятно, это тоже вызовет сбой.
Убедитесь, что в директории dirBar есть файл __init__.py
— он превращает директорию в пакет Python.
Вы также можете добавить подпапку в ваш Python путь, чтобы импортировать её как обычный скрипт.
import sys
sys.path.insert(0, <путь к dirFoo>)
import Bar
Таким образом, вы сможете использовать модуль Bar
, находящийся в подпапке dirFoo
, без необходимости перемещения файлов. Не забудьте заменить <путь к dirFoo>
на фактический путь к вашей директории.
Вы можете использовать следующий код для добавления пути к вашей библиотеке в 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
действительно находится там, где вы ожидаете.
Вы можете просто выполнить несколько простых шагов, чтобы импортировать файл .py из другой папки.
Предположим, у вас есть следующая структура каталогов:
lib/abc.py
Вам потребуется создать пустой файл в папке lib
, называемый
__init__.py
После этого вы сможете использовать такой импорт:
from lib.abc import <Название вашего модуля>
Не забудьте оставить файл __init__.py
в каждой папке иерархии импортируемого модуля. Это позволит Python распознавать директории как пакеты.
Импорт файлов из другой папки
Как импортировать другие файлы Python?
Как получить абсолютный путь к файлу в Python
Относительные импорты в Python 3
Как импортировать класс в пределах той же директории или поддиректории?