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

Вот структура каталогов:

parent_dir/
    foo_dir/
        foo.py
    bar_dir/
        bar.py

Как импортировать bar.py в foo.py?


person Orcris    schedule 22.04.2012    source источник
comment
См.: stackoverflow.com/questions/6323860/sibling-package-imports /   -  person Paolo Rovelli    schedule 10.01.2015


Ответы (2)


Если все встречающиеся каталоги являются пакетами Python, т. е. все они содержат __init__.py, то вы можете использовать

from ..bar_dir import bar

Если каталоги не являются пакетами Python, вы можете сделать это, повозившись с sys.path, но вы не должны этого делать.

person Sven Marnach    schedule 22.04.2012
comment
это не сработает, если вы хотите импортировать не в пакете, а просто запускаете python от брата или сестры. В этом случае sys.path.append - это путь - person mhstnsc; 01.11.2017
comment
@mhstnsc Я бы сказал, что в этом случае вы сделали что-то не так, но если это просто какой-то хакерский скрипт, может быть, можно возиться с sys.path. - person Sven Marnach; 01.11.2017
comment
Это не так, но при запуске основного модуля вы не можете выполнять относительный импорт. python.org/dev/peps/pep-0366 - person mhstnsc; 02.11.2017
comment
Когда я запускаю ipython foo.py на этом, я получаю ImportError: attempted relative import with no known parent package. Я добавил файл __init__.py в родительский каталог и каталог bar_dir - person ogogmad; 06.07.2018
comment
@ogogmad, ты нашел решение этой проблемы? Спасибо - person Ash Oldershaw; 09.07.2020
comment
Как и @ogogmad, запуск с python3 также дает ту же ошибку. ImportError: attempted relative import with no known parent package - person Pe Dro; 15.09.2020
comment
Нет, это не работает с python3.8. - person Ivan Castellanos; 18.01.2021
comment
Это работает в Python 3.8, но требует, чтобы родительский пакет был доступен для Python и чтобы модуль был импортирован как часть этого пакета. Вероятно, мне следует немного расширить этот ответ, но у меня нет на это времени. - person Sven Marnach; 18.01.2021

Вы можете использовать модули sys и os для обобщенного импорта. В foo.py начните со строк

import sys
import os
sys.path.append(os.path.abspath('../bar_dir'))
import bar
person prrao    schedule 22.04.2012
comment
Обратите внимание, что при этом будет использоваться одноуровневый каталог cwd, а не одноуровневый каталог, где находится foo.py. Чтобы использовать каталог скрипта, используйте sys.path.append(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'bar'))) - person cowlinator; 07.04.2021
comment
Единственное, что работало на всей этой странице. - person C Johnson; 21.04.2021