2012-02-03 11 views
11

Duplicar posible:
How to properly use relative or absolute imports in Python modules?pitón código relativa Ejemplo de importación no funciona

que tienen esta estructura del archivo, como se muestra en este ejemplo: (descargar aquí: http://www.mediafire.com/?oug42nzvxrvoms4) http://www.python.org/dev/peps/pep-0328/#guido-s-decision

móduloX 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 sucede:

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 

tengo Python 2.7.2. Tengo

__init__.py 

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

+4

Me parece que esta Q & A es más útil que la que se ha marcado como duplicada. – ArtOfWarfare

+0

Robot duplicado taggers ;-) – nicorellius

Respuesta

20

A partir de los documentos:

se puede ver esto:

importaciones en relación con el uso nombre atributo 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 información del paquete (por ejemplo, está configurado en 'principal'), las importaciones relativas se resuelven como si el módulo fuera un módulo de nivel superior, independientemente de dónde esté ubicado realmente 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 colocará 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 su caso desde c:\ directamente:

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

Nota una cosa - las importaciones en moduleX.py son estos:

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 

La segunda para durar:

from ...package import bar 

requiere que la carpeta raíz (c:\ en su caso) sea un paquete (es decir tener __init__.py). Además, requiere una variable de barra definida en package\__init__.py, que actualmente no está allí (entonces ponga bar = 'bar!' allí para la prueba).También requiere que esté un nivel arriba, por lo que debe colocar la carpeta package en otra carpeta (para que termine 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 la anterior PEP 328 enlace:

Tenga en cuenta que mientras que el último caso es legal, es ciertamente desanimado ("loco" fue el palabra que Guido usó).

Ver también otros SOqs sobre esto que podrían ayudar:

Espero que esto ayude.

Cuestiones relacionadas