Примерный пример кода примера импорта python не работает

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

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

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

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

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

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

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

python -m package.subpackage1.moduleX

Это импортирует модульX и помещает верхний уровень в пакет. Выполнить из верхней части иерархии:

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:

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

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

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