Пример кода относительного импорта Python не работает

Возможный дубликат:
Как правильно использовать относительный или абсолютный импорт в модулях Python?

У меня есть этот макет файла, как показано в этом примере: (скачать здесь: http://www.mediafire.com/?oug42nzvxrvoms4) http://www.python.org/dev/peps/pep-0328/

moduleX содержит:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

и вот что происходит:

C:\package\subpackage1>python moduleX.py
Traceback (most recent call last):
  File "moduleX.py", line 1, in <module>
    from .moduleY import spam
ValueError: Attempted relative import in non-package

У меня есть Python 2.7.2. я имею

__init__.py

файлы в каждом каталоге. Почему этот код не работает?

1 ответ

Из документов:

Вы можете увидеть это:

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

Запустив его как python moduleX.pyВы делаете именно выше. Вместо этого попробуйте это:

python -m package.subpackage1.moduleX

Это импортирует moduleX и помещает верхний уровень в пакет. Запустите с вершины иерархии:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

т.е. в вашем случае от c:\ непосредственно:

c:\>python -m package.subpackage1.moduleX

Обратите внимание на одно - импорт в moduleX.py эти:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

Второй до последнего:

from ...package import bar

требуется корневая папка (c:\ в вашем случае) быть пакетом (т.е. иметь __init__.py). Также требуется переменная bar, определенная в package\__init__.py, которого сейчас нет bar = 'bar!' там для теста). Это также требует, чтобы вы были на один уровень выше, поэтому вы должны поставить package папка в другой папке (так что вы в конечном итоге c:\toppackage\package) и беги c:\python -m toppackage.package.subpackage1.moduleX,

Для этой строки:

from ...sys import path

в приведенной выше ссылке PEP 328 есть примечание:

Обратите внимание, что, хотя этот последний случай является законным, он, безусловно, не рекомендуется (слово "безумный" использовалось Гвидо).

Смотрите также другие SOqs об этом, которые могут помочь:

Надеюсь это поможет.

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