Pregunta

Tengo dos módulos de Python:

a.py

import b

def hello():
  print "hello"

print "a.py"
print hello()
print b.hi()

b.py

import a

def hi():
  print "hi"

Cuando corro a.py, me sale:

AttributeError: 'module' object has no attribute 'hi'

¿Qué significa el error? ¿Cómo lo arreglo?

¿Fue útil?

Solución

Tiene importaciones mutuas de alto nivel, que es casi siempre una mala idea.

Si realmente debe tener las importaciones mutuas en Python, la manera de hacerlo es a importarlos dentro de una función:

# In b.py:
def cause_a_to_do_something():
    import a
    a.do_something()

Ahora a.py puede hacer con seguridad import b sin causar problemas.

(A primera vista podría parecer que cause_a_to_do_something() sería altamente ineficiente, ya que hace un import cada vez que se llame, pero en realidad el trabajo de importación únicamente se hace por primera vez. La segunda vez que vuelva a importar un módulo, es una operación rápida.)

Otros consejos

También he visto este error al nombrar inadvertidamente un módulo con el mismo nombre que uno de los módulos estándar de Python. P.ej. Tenía un módulo llamado commands que es también un módulo de biblioteca de Python. Esto resultó ser difíciles de localizar, ya que trabajó correctamente en mi entorno de desarrollo local, pero falló con el error especificado cuando se ejecuta en Google App Engine.

El problema es la dependencia circular entre los módulos. las importaciones y las importaciones a b b a. Pero uno de ellos tiene que ser cargado primero -. En este caso pitón termina la inicialización a módulo antes b y b.hi() aún no existe cuando intenta acceder a él en a

Tengo este error haciendo referencia a una enumeración que fue importado de una manera incorrecta, por ejemplo:.

from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member

importación correcta:

from package.MyEnumClass import MyEnumClass

Espero que ayude a alguien

he experimentado este error debido a que el módulo no se hayan importado efectivamente. El código se veía así:

import a.b, a.c

# ...

something(a.b)
something(a.c)
something(a.d)  # My addition, which failed.

La última línea dio lugar a un AttributeError. La causa fue que había dejado de notar que los submódulos de a (a.b y a.c) fueron explícitamente importados, y asumió que la declaración import realmente importadas a.

Todas las respuestas anteriores son grandes, pero me gustaría que tocar aquí. Si no detectar cualquier problema antes mencionado, trate de aclarar su entorno de trabajo. Se trabajó para mí.

Me encontré con este problema cuando me fui una versión anterior de un repositorio de Git. Git reemplazado mis archivos .py, pero dejó a los archivos .pyc sin seguimiento. Dado que los archivos y los archivos .py .pyc estaban fuera de sincronización, el comando en un archivo import .py no pudo encontrar el módulo correspondiente en los archivos .pyc.

La solución era simplemente eliminar los archivos .pyc, y dejar que ellos pueden regenerar de forma automática.

Me enfrenté a la misma cuestión. fija mediante el uso de reload.

import the_module_name
from importlib import reload
reload(the_module_name)

No sabe cómo pero el cambio a continuación ordenadas según mi problema:

Yo estaba teniendo el nombre de archivo y nombre de importación para el mismo ejemplo que tenía nombre de archivo como emoji.py y yo estaba tratando de importar emoji. Pero cambiar el nombre del archivo resolvió el problema.

La esperanza por lo que ayuda

importaciones circulares causar problemas, pero Python tiene formas de mitigarlo incorporado.

El problema es cuando se ejecuta python a.py, se ejecuta a.py pero no marcarlo importa como un módulo. Así que, a su vez a.py -> importaciones Módulo B -> módulo de importaciones a -> b módulo de importaciones. La última importación de un no-op Puesto que B está siendo importado y guardias de Python contra eso. Y b es un módulo vacío por ahora. Así que cuando se ejecuta b.hi(), no se puede encontrar nada.

Tenga en cuenta que el b.hi() que quedó ejecutado es durante a.py -> Módulo B -.> Módulo A, no en a.py directamente

En el ejemplo específico, sólo se puede ejecutar en python -c 'import a' de nivel superior, por lo que la primera ejecución de a.py está registrada como la importación de un módulo.

@ MD5 Lo mismo para mí, Intente cambiar el nombre del módulo o importar directamente a la función

en ubuntu 18.04 ( virtualenv , python.3.6.x ), la siguiente recarga fragmento resuelto el problema para mí:

main.py

import my_module  # my_modyle.py
from importlib import reload # reload 
reload(my_module)

print(my_module)
print(my_modeule.hello())

donde:

|--main.py    
|--my_module.py

para más documentación Comprobar: aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top