Как правильно импортировать из вложенной папки выше? - PullRequest
0 голосов
/ 13 ноября 2018

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

/a
 /b
  module1.py
/c
  module2.py

Итак, из некоторой корневой папки есть 2 модуля:

a / b / module1.py и

c/module2.py

Я хочу выполнить импорт какой-либо функции module1 из модуля 2.

Все 3 папки имеют ____ init ___. py

Оба файла py имеют внутреннюю часть:

if __name__ == '__main__':
    func()

module2.py имеет следующий код импорта:

from .. a.b.module1 import func1

Если я просто запускаю module2.py из терминала (оставаясь в корневой папке):

python -m c.module2.py 

У меня следующая ошибка:

ValueError: attempted relative import beyond top-level package

Как решить эту проблему?

1 Ответ

0 голосов
/ 13 ноября 2018

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

Способ установки каталогов для воспроизведения вашей ошибки заключается в следующем:

Корневой каталог: /package:

/package
/package/__init__.py
/package/a
/package/a/__init__.py
/package/a/b
/package/a/b/__init__.py
/package/a/b/module1.py
/package/c
/package/c/__init__.py
/package/c/module2.py

В package/__init__.py введитемодуль верхнего уровня импортирует:

from a.b import module1

и затем единственное изменение, которое я сделал, - module2.py, чтобы содержать только эту функцию для тестирования:

from package import a # import top-level module from root package 

def func():
    a.b.module1.some_object() # call function of module1 from module2 (this module).

if __name__ == '__main__':
    func()

, затем на верхнем уровнекорень пакета, из терминала вы сможете запустить module2.py:

$ python package/c/module2.py 

должен распечатать:

from a.b.module1: some object

Для точного поведения могут быть сделаны улучшения и уточненияВы хотите.

Для справки, я использовал предложения этого ответа: Как избежать циклического импорта в Python?

...