не может получить доступ к модулям с использованием относительного импорта - PullRequest
2 голосов
/ 23 сентября 2019

У меня есть структура папок, как показано ниже

mypackage/
    __init__.py
    package1/
        __init__.py
        module1.py        # has ClassOne 
        module2.py        # has ClassTwo
        script.py
    package2/
        __init__.py
        module3.py        # has ClassThree
        module4.py        # has ClassFour

В script.py Я хочу получить доступ к ClassFour из module4, поэтому я использую относительный импорт, как показано ниже

from ..module4 import ClassFour

c = ClassFour()

, но яЯ получаю сообщение об ошибке

ValueError: попытка относительного импорта за пределы пакета верхнего уровня

Я знаю, что могу решить эту проблему, используя

import sys

sys.path.append("path/to/my/module/")

Но яЯ заинтересован в решении с относительным импортом.

Я задал несколько вопросов и попробовал решения, такие как - Как сделать относительный импорт

А также попытался запустить мой файл, используя

скрипт python -m

но безуспешно

Ответы [ 2 ]

4 голосов
/ 23 сентября 2019

Вам просто нужно вызвать package2, прежде чем вызывать module4 как,

из ..package2.module4 import ClassFour

как одиночный .. вы можете выпрыгнуть изpackage1, но не получил доступ к package2 и его файлу.

Например, вы можете посмотреть на следующую структуру.

enter image description here

Напомним содержимое файла:

package1/module2.py contains a function, function1.
package2/__init__.py contains a class, class1.
package2/subpackage1/module5.py contains a function, function2.

Вы можете импортировать class1 и function2 в файл package2 / module3.py следующим образом:

from . import class1
from .subpackage1.module5 import function2

, чтобы получить дополнительную информацию, перейдите по этой ссылке: Ссылка

1 голос
/ 23 сентября 2019

Для запуска вашего скрипта внутри пакета вы можете сделать:

python -m mypackage.package1.script

Если вы не установили пакет (например, через pip), вам нужно вызвать эту команду из родительского каталога mypackage(в противном случае подойдет любой каталог).

Для этого вам также необходимо исправить используемый вами импорт.На данный момент ..module4 не указывает на существующий модуль.Вместо этого это должно быть

from ..package2.module4 import ClassFour

. Или, если вы импортировали ClassFour в package2/__init__.py, то вы также можете сделать:

from ..package2 import ClassFour
...