2011-05-26 18 views
9

Tengo una estructura de directorios:Cómo depurar el fracaso de importación de Python

network/__init__.py 
network/model.py 
network/transformer/__init__.py 
network/transformer/t_model.py 

ambos archivos tienen __init__.py apropiada

__all__ = [ 
    "model", # or "t_model" in the case of transformer 
    "view", 
    ] 

En t_model.py, tengo

from .. import model 

pero dice:

ImportError: cannot import name model 

Si intento

from ..model import Node 

Dice:

ImportError: cannot import name Node 

Estos son errores muy confusos.


Editar: Incluso una importación absoluta falla:

import network as N 
print(dir(N), N.__all__) 
import network.model as M 

['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'transformer'] ['model', 'view'] 
Traceback (most recent call last):.......... 
AttributeError: 'module' object has no attribute 'model' 

Editar: Fue una importación circular.

+0

¿Qué versión de Python? –

+0

@Ignacio: Versión 2.7 –

+0

¿Qué línea de comando de python estás usando para iniciar tu aplicación? –

Respuesta

4

Esto funciona para mí. ¿Puedes ejecutar/importar model.py? Si tiene errores de sintaxis, no puede importarlo. (En general recomiendo no para hacer importaciones relativas, el uso de ellas es limitado).

Su importación absoluta es muy confusa. La forma de hacer una importación absoluta en este paquete es:

from network model import Node 

Esto funciona bien.

Tengo un program.py en el nivel superior (por encima de la red):

de network.transformer t_model importación

Y el t_model.py se parece a esto:

from .. import model 
print "Model", model 

from ..model import Node 
print "Node", Node 

from network.model import Node 
print "Absolute", Node 

Y la salida es:

Model <module 'network.model' from '/tmp/network/model.pyc'> 
Node <class 'network.model.Node'> 
Absolute <class 'network.model.Node'> 

Así que como puede ver, funciona bien su error es un poco dónde más.

+0

Si lo hago desde el nodo de importación de network.model, dice ImportError: no puede importar el nombre Node –

+0

@Neil G: Por supuesto. Como mostré arriba, sus importaciones relativas son correctas, el error está en otro lugar, no en cómo escribe la importación. Ahora, si lees mi respuesta, verás que te hago una pregunta. Si quiere ayuda con esto, le sugiero que lo responda. –

+1

Importación de model.py era el problema. Resultó que model.py estaba importando t_model.py, que importó model.py. Casi estaba tirando de mi pelo en este caso. Muchas gracias por su ayuda. –

0

De this question.

project/ 
    program.py   # entry point to the program 
    network/   
     __init__.py 
     transform/  # .. will target network 
      __init__.py 

Creo que también puede ejecutar network/model.py en el directorio a continuación y obtener importaciones relativas a la red. así que ...

network/ 
    model.py 
    __init__.py 

allí tendría que iniciar el programa con $ python network/model.py. Puede o no necesitar presionar __init__.py en su lugar. Tenía un programa de motor de aplicación que apuntaba a module/__init__.py y las importaciones relativas funcionaban muy bien.

+0

Gracias. Tengo '__init __. Py' en cada carpeta. –

Cuestiones relacionadas