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
, obtengo:
AttributeError: 'module' object has no attribute 'hi'
¿Qué significa el error? ¿Cómo lo soluciono?
python
attributeerror
Stephen Hsu
fuente
fuente
Respuestas:
Tiene importaciones mutuas de alto nivel, lo que casi siempre es una mala idea.
Si realmente debe tener importaciones mutuas en Python, la forma de hacerlo es importarlas dentro de una función:
Ahora a.py puede hacerlo de forma segura
import b
sin causar problemas.(A primera vista, puede parecer que
cause_a_to_do_something()
sería muy ineficiente porque lo haceimport
cada vez que lo llama, pero de hecho, el trabajo de importación solo se realiza la primera vez. La segunda y posteriores veces que importa un módulo, es una operación rápida. )fuente
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. Por ejemplo, tenía un módulo llamado
commands
que también es un módulo de biblioteca de Python. Esto resultó difícil de rastrear, ya que funcionó correctamente en mi entorno de desarrollo local, pero falló con el error especificado cuando se ejecutaba en Google App Engine.fuente
El problema es la dependencia circular entre los módulos.
a
importacionesb
eb
importacionesa
. Pero uno de ellos debe cargarse primero; en este caso, Python termina inicializando el móduloa
antesb
yb.hi()
aún no existe cuando intenta acceder a éla
.fuente
Obtuve este error haciendo referencia a una enumeración que se importó de manera incorrecta, por ejemplo:
Importación correcta:
Espero que ayude a alguien
fuente
Experimenté este error porque el módulo no se importó realmente. El código se veía así:
La última línea resultó en un
AttributeError
. La causa fue que no noté que los submódulos dea
(a.b
ya.c
) fueron importados explícitamente , y asumí que laimport
declaración realmente importabaa
.fuente
Me enfrenté al mismo problema. arreglado mediante el uso
reload
.fuente
Me encontré con este problema cuando revisé una versión anterior de un repositorio de git. Git reemplazó mis
.py
archivos, pero dejó los.pyc
archivos sin seguimiento . Como los.py
archivos y los.pyc
archivos no estaban sincronizados, elimport
comando en un.py
archivo no pudo encontrar el módulo correspondiente en los.pyc
archivos.La solución fue simplemente eliminar los
.pyc
archivos y dejar que se regeneren automáticamente.fuente
.pyc
archivos:find . -name "*.pyc" -exec rm -f {} \;
en ubuntu 18.04 ( virtualenv , python.3.6.x ), el siguiente fragmento de recarga resolvió el problema para mí:
main.py
dónde:
para más verificación de documentación : aquí
fuente
Todas las respuestas anteriores son geniales, pero me gustaría hablar aquí. Si no detectó ningún problema mencionado anteriormente, intente aclarar su entorno de trabajo. Funcionó para mi.
fuente
No estoy seguro de cómo, pero el cambio a continuación solucionó mi problema:
Tenía el nombre del archivo y el nombre de la misma importación, por ejemplo, tenía el nombre del archivo como emoji.py e intentaba importar emoji. Pero cambiar el nombre del archivo resolvió el problema.
Espero que ayude
fuente
Las importaciones circulares causan problemas, pero Python tiene formas de mitigarlo incorporado.
El problema es cuando se ejecuta
python a.py
, se ejecutaa.py
pero no se marca como importado como módulo. Entonces, a su veza.py
-> importa el módulo b -> importa el módulo a -> importa el módulo b. La última importación es no operativa ya que b se está importando actualmente y Python protege contra eso. Y b es un módulo vacío por ahora. Entonces cuando se ejecutab.hi()
, no puede encontrar nada.Tenga en cuenta que lo
b.hi()
que se ejecutó es durantea.py
-> módulo b -> módulo a, noa.py
directamente.En su ejemplo específico, puede ejecutar
python -c 'import a'
en el nivel superior, por lo que la primera ejecución dea.py
se registra como la importación de un módulo.fuente
El orden de importación fue la razón por la que tenía problemas:
a.py
:b.py
:Solo otro ejemplo de cómo se vería, similar a la respuesta de RichieHindie, pero con clases.
fuente
Me he cruzado con este problema muchas veces, pero no intenté profundizar más al respecto. Ahora entiendo el problema principal.
Esta vez mi problema fue importar serializadores (django y restframework) desde diferentes módulos como los siguientes:
Estaba teniendo un problema como este:
Lo que quería lograr era lo siguiente:
Entonces, como se menciona en las líneas anteriores sobre cómo resolverlo (importación de nivel superior), procedo a hacer los siguientes cambios:
Por lo tanto, django runserver se ejecutó sin problemas:
El estado final de las líneas de código fue el siguiente:
Espero que esto pueda ser útil para todos los demás.
Saludos,
fuente
En mi caso, trabajando con python 2.7 con numpy versión 1.15.0, funcionó con
fuente