Вопрос-Ответ

Import a module from a relative path

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

Как мне импортировать модуль Python с учетом его относительного пути?

Например, если dirFoo содержит Foo.py и dirBar, и dirBar содержит Bar.py, как мне импортировать Bar.py в Foo.py?

Вот визуальное представление:

dirFoo\
Foo.py
dirBar\
Bar.py

Foo хочет включить Bar, но реструктуризация иерархии папок невозможна.

Переведено автоматически
Ответ 1

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

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

 import os, sys, inspect
# realpath() will make your script run, even if you symlink it :)
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)

# Use this if you want to include modules from a subfolder
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)

# Info:
# cmd_folder = os.path.dirname(os.path.abspath(__file__)) # DO NOT USE __file__ !!!
# __file__ fails if the script is called in different ways on Windows.
# __file__ fails if someone does os.chdir() before.
# sys.argv[0] also fails, because it doesn't not always contains the path.

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

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

Ответ 2

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

Ответ 3

Вы также можете добавить подкаталог в свой Python path, чтобы он импортировался как обычный скрипт.

import sys
sys.path.insert(0, <path to dirFoo>)
import Bar
Ответ 4
import os
import sys
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))
sys.path.append(lib_path)

import mymodule
python