Eu tenho dois módulos 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"
Quando corro a.py
, recebo:
AttributeError: 'module' object has no attribute 'hi'
O que significa o erro? Como faço para corrigir isso?
python
attributeerror
Stephen Hsu
fonte
fonte
Respostas:
Você tem importações mútuas de nível superior, o que quase sempre é uma má idéia.
Se você realmente deve ter importações mútuas no Python, a maneira de fazer isso é importá-las dentro de uma função:
Agora o a.py pode fazer com segurança
import b
sem causar problemas.(À primeira vista, pode parecer que
cause_a_to_do_something()
seria imensamente ineficiente, porque é feitoimport
toda vez que você o chama, mas, na verdade, o trabalho de importação é feito apenas na primeira vez. Na segunda e subsequente importação de um módulo, é uma operação rápida. )fonte
Também vi esse erro ao nomear inadvertidamente um módulo com o mesmo nome que um dos módulos Python padrão. Por exemplo, eu tive um módulo chamado,
commands
que também é um módulo de biblioteca Python. Foi difícil rastrear isso, pois funcionava corretamente no meu ambiente de desenvolvimento local, mas falhou com o erro especificado ao ser executado no Google App Engine.fonte
O problema é a dependência circular entre os módulos.
a
importaçõesb
eb
importaçõesa
. Mas um deles precisa ser carregado primeiro - nesse caso, o python acaba inicializando o móduloa
antesb
eb.hi()
ainda não existe quando você tenta acessá-loa
.fonte
Eu recebi esse erro referenciando uma enumeração que foi importada de maneira errada, por exemplo:
Importação correta:
Espero que ajude alguém
fonte
Ocorreu este erro porque o módulo não foi realmente importado. O código ficou assim:
A última linha resultou em um
AttributeError
. A causa foi que eu não percebi que os submódulos dea
(a.b
ea.c
) foram explicitamente importados e assumi que aimport
instrução realmente era importadaa
.fonte
Eu enfrentei o mesmo problema. corrigido usando
reload
.fonte
Eu me deparei com esse problema quando fiz o check-out de uma versão mais antiga de um repositório do git. O Git substituiu meus
.py
arquivos, mas deixou os.pyc
arquivos não rastreados . Como os.py
arquivos e.pyc
arquivos estavam fora de sincronia, oimport
comando em um.py
arquivo não pôde encontrar o módulo correspondente nos.pyc
arquivos.A solução foi simplesmente excluir os
.pyc
arquivos e permitir que eles sejam regenerados automaticamente.fonte
.pyc
arquivos:find . -name "*.pyc" -exec rm -f {} \;
no ubuntu 18.04 ( virtualenv , python.3.6.x ), o seguinte snippet de recarga resolveu o problema para mim:
main.py
Onde:
para mais documentação, consulte: aqui
fonte
Todas as respostas acima são ótimas, mas eu gostaria de comentar aqui. Se você não encontrou nenhum problema mencionado acima, tente limpar o seu ambiente de trabalho. Funcionou para mim.
fonte
Não sei como, mas a alteração abaixo classificou meu problema:
Eu estava tendo o nome do arquivo e o mesmo nome de importação, por exemplo, tinha o nome do arquivo como emoji.py e estava tentando importar emoji. Mas alterar o nome do arquivo resolveu o problema.
Espero que ajude
fonte
As importações circulares causam problemas, mas o Python tem maneiras de atenuá-lo.
O problema é que, quando você executa
python a.py
, ele é executado,a.py
mas não o marca como importado como módulo. Então, por sua veza.py
-> módulo de importação b -> módulo de importação a -> módulo de importação b. A última importação a no-op desde que b está sendo importada e o Python protege contra isso. E b é um módulo vazio por enquanto. Então, quando ele executab.hi()
, não consegue encontrar nada.Observe que o
b.hi()
que foi executado ocorre durantea.py
-> módulo b -> módulo a, não ema.py
diretamente.No seu exemplo específico, você pode simplesmente executar
python -c 'import a'
no nível superior, para que a primeira execução dea.py
seja registrada como importando um módulo.fonte
A ordem da importação foi a razão pela qual eu estava tendo problemas:
a.py
:b.py
:Apenas mais um exemplo de como isso pode parecer, semelhante à resposta de RichieHindie, mas com classes.
fonte
Já enfrentei esse problema muitas vezes, mas não tentei me aprofundar mais. Agora eu entendo a questão principal.
Dessa vez, meu problema foi importar serializadores (django e restframework) de diferentes módulos, como os seguintes:
Eu estava tendo um problema como este:
O que eu queria realizar era o seguinte:
Portanto, conforme mencionado nas linhas acima, como resolvê-lo (importação de nível superior), procedo às seguintes alterações:
Portanto, o django runserver foi executado sem problemas:
O estado final das linhas de código foi o seguinte:
Espero que isso possa ser útil para todos os outros.
Saudações,
fonte
No meu caso, trabalhando com python 2.7 com numpy versão 1.15.0, ele trabalhou com
fonte