Относительный импорт в Python - PullRequest
28 голосов
/ 14 ноября 2010

Привет всем - я вытащил свои волосы с относительным импортом в 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, который прекрасно обращается к модулям из компонентов.

Однако код внутри модуля расширения и language_id для доступа к функциональному модулю:

from ..utilities.functions import *

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

ValueError: Attempted relative import beyond toplevel package

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

1 Ответ

21 голосов
/ 14 ноября 2010

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

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, и это сработало. Кажется нелогичным.

...