El código de ejemplo de importación relativa de Python no funciona

Posible duplicado:
¿Cómo utilizar correctamente las importaciones relativas o absolutas en los módulos de Python?

Tengo este diseño de archivo, como se muestra en este ejemplo: (descargue aquí: http://www.mediafire.com/?oug42nzvxrvoms4 ) http://www.python.org/dev/peps/pep-0328/#guido- s-decision

moduleX contiene:

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 

Y esto es lo que pasa:

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

Tengo python 2.7.2. yo tengo

 __init__.py 

Archivos en cada directorio. ¿Por qué este código no funciona?

De los documentos:

Puedes ver esto:

Las importaciones relativas utilizan el atributo de nombre de un módulo para determinar la posición de ese módulo en la jerarquía de paquetes. Si el nombre del módulo no contiene ninguna información de paquete (por ejemplo, está configurado como ‘ principal ‘), las importaciones relativas se resuelven como si el módulo fuera un módulo de nivel superior, independientemente de dónde se encuentre el módulo en el sistema de archivos.

Al ejecutarlo como python moduleX.py , está haciendo exactamente lo anterior. En su lugar, intente esto:

 python -m package.subpackage1.moduleX 

Esto importará moduleX y pondrá el nivel superior en el paquete. Ejecutar desde la parte superior de la jerarquía:

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

Es decir, en tu caso desde c:\ directamente:

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

Tenga en cuenta una cosa: las importaciones en moduleX.py son estas:

 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 

El segundo al último:

 from ...package import bar 

requiere que la carpeta raíz ( c:\ en su caso) sea un paquete (es decir, tenga __init__.py ). Además, requiere una variable de barra definida en el package\__init__.py , que actualmente no está allí (así que ponga bar = 'bar!' Para la prueba). También requiere que c:\toppackage\package nivel, por lo que debes colocar la carpeta del package en otra carpeta (para que c:\toppackage\package con c:\toppackage\package ) y ejecutar c:\python -m toppackage.package.subpackage1.moduleX .

Para esta línea:

 from ...sys import path 

Hay una nota en el enlace PEP 328 anterior:

Tenga en cuenta que si bien el último caso es legal, ciertamente se desalienta (“locura” fue la palabra que usó Guido).

Vea también otras preguntas sobre esto que podrían ayudar:

  • ¿Cómo hacer importaciones relativas en Python?
  • ¿Alguien puede explicar las importaciones relativas de python?
  • Cómo lograr una importación relativa en Python
  • rareza relativa de la importación del python
  • Importaciones relativas en Python

Espero que esto ayude.