Относительный импорт в Python

Привет всем - я вытаскиваю свои волосы с относительным импортом в Python. Я прочитал документацию 30 раз и многочисленные посты здесь на SO и других форумах - все еще, кажется, не работает.

Моя структура каталогов в настоящее время выглядит следующим образом

src/
    __init__.py
    main.py
    components/
        __init__.py
        expander.py
        language_id.py
    utilities/
        __init__.py
        functions.py

Я хочу, чтобы expander.py и language_id.py имели доступ к модулю функций. Я запускаю python main.py, который прекрасно обращается к модулям из компонентов component.expander import * и component.language_id import *.

Тем не менее, код внутри expander и language_id для доступа к модулю функций:

from ..utilities.functions import *

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

ValueError: Attempted relative import beyond toplevel package

Я прошел через это несколько раз, и, похоже, я следую документации. У кого-нибудь есть идеи, что здесь происходит не так?

1 ответ

Решение

Неважно, я решил это:

src/
    main.py
    mod/
        __init__.py
        components/
            __init__.py
            expander.py
            language_id.py
        utilities/
            __init__.py
            functions.py

Затем main.py ссылается на подпакеты как:

from mod.components.expander import *
from mod.utilities.functions import *

expander.py и language_id.py имеют доступ к functions.py с помощью:

from ..utilities.functions import *

Но интересно то, что у меня был текстовый файл в каталоге компонентов, который использует expander.py. Однако во время выполнения он не мог найти файл, даже если он находился в том же каталоге. Я переместил текстовый файл в тот же каталог, что и main.py, и это сработало. Кажется нелогичным.

Другие вопросы по тегам