Как решить "ValueError: попытка относительного импорта за пределы пакета верхнего уровня" - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующая проблема с моим проектом, помогите мне, пожалуйста! Вот структура моего пакета:

/pkg

/pkg/__init__.py
/pkg/sub1/__init__.py
/pkg/sub2/__init__.py

/pkg/sub1/foo1.py
/pkg/sub2/foo2.py

Вот реализация foo1.py:

from ..sub2 import foo2

def f():
    print("Hello!")

Когда я запускаю foo1, я получаю ошибку: ValueError: попытка относительного импорта за пределы пакета верхнего уровня .

Я могу решить это, выполнив следующую настройку:

import sys
import os
sys.path.append(os.path.abspath(os.path.pardir))

from sub2 import foo2
def f():
    print("Hello!")

Но мне интересно, есть ли способ сделать это без импорта sys и добавления в него родительского каталога.

Я слышал, что если бы у меня был файл .py, например, /pkg/start.py, который вызывал мой модуль foo1, то две точки работали бы. Однако есть ли способ напрямую вызвать foo2 из foo1?

1 Ответ

0 голосов
/ 28 июня 2018

Мне кажется, что без добавления pkg в мой PATH невозможно импортировать модули из sub2 в sub1. Вот объяснение, почему:

Относительный импорт использует атрибут name модуля для определения позиции этого модуля в иерархии пакетов. Если имя модуля не содержит никакой информации о пакете (например, оно установлено на « main »), то относительный импорт разрешается так, как если бы модуль был модулем верхнего уровня, независимо от того, где модуль фактически расположен на файловая система.

Вот официальный сайт Python, где это объясняется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...