Относительный импорт в python с локальными англоязычными глобальными библиотеками - PullRequest
2 голосов
/ 16 апреля 2019

Мои приложения организованы так:

apps/
    code/
        libglobal/
            funglobal.py
    tests/
        project/
            liblocal/
                funlocal.py
            main.py

В main.py У меня есть:

import liblocal.funlocal

В funlocal.py Я пытаюсь импортировать funglobal.py с:

from ....code.libglobal import funglobal

Когда я бегу

python3 -B tests/project/main.py

Я получаю ошибку:

from ....code.libglobal import funglobal
ValueError: attempted relative import beyond top-level package

Я прочитал много информации об относительном импорте с помощью python3 и до сих пор не нашел, как решить эту ошибку без радикального изменения организации apps . Любое решение?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Поскольку выполняемый сценарий имеет __name__, установленный как __main__, и определяет себя как находящийся на верхнем уровне пакета, он отказывается распознавать сценарии в одноуровневых каталогах.

Вы можете исправить это с помощью sys.path хака:

import sys, os
sys.path.insert(0, os.path.abspath('../..'))

или пересекающаяся альтернатива с setuptools представлена ​​в этом ответе .

0 голосов
/ 16 апреля 2019

Есть ли у вас __init__.py скрипт в каждой папке?

Если нет, вы должны создать пустой скрипт с именем __init__.py в каждой папке.

...