Eu tenho quatro arquivos diferentes nomeados: principal, vetor, entidade e física. Não vou postar todo o código, apenas as importações, porque acho que é aí que está o erro. (Se você quiser, posso postar mais)
A Principal:
import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement
Entidade:
from vector import Vect
from physics import Physics
class Ent:
#holds vector information and id
def tick(self, dt):
#this is where physics changes the velocity and position vectors
Vetor:
from math import *
class Vect:
#holds i, j, k, and does vector math
Física:
from entity import Ent
class Physics:
#physics class gets an entity and does physics calculations on it.
Em seguida, corro de main.py e recebo o seguinte erro:
Traceback (most recent call last): File "main.py", line 2, in <module> from entity import Ent File ".../entity.py", line 5, in <module> from physics import Physics File ".../physics.py", line 2, in <module> from entity import Ent ImportError: cannot import name Ent
Eu sou muito novo em Python, mas trabalhei com C ++ por um longo tempo. Suponho que o erro se deva a importar a entidade duas vezes, uma na principal e mais tarde na física, mas não conheço uma solução alternativa. Alguém pode ajudar?
from <module> import <name>
oufrom <modlue> import *
. Melhor importar no espaço de nome do módulo para evitar a chance de substituir referências nomeadas de forma idêntica.Entity
e, emVector
vez deEnt
eVect
, não há razão para encurtar esses nomes. E sim, useimport vector
e entãox = vector.Vector(0,0,0)
.Respostas:
Você tem importações dependentes circulares.
physics.py
é importado deentity
antes da classeEnt
ser definida ephysics
tenta importarentity
que já está inicializando. Remova a dependênciaphysics
doentity
módulo.fonte
Entity
e estãoPhysics
ligados um ao outro? Tenho certeza de que há uma solução alternativa para o que você está tentando fazer.Embora você deva definitivamente evitar dependências circulares, você pode adiar as importações em python.
por exemplo:
isso (pelo menos em alguns casos) contornará o erro.
fonte
Esta é uma dependência circular. Pode ser resolvido sem nenhuma modificação estrutural no código. O problema ocorre porque
vector
você exige queentity
seja disponibilizado para uso imediato e vice-versa. A razão para esse problema é que você está pedindo para acessar o conteúdo do módulo antes de ele estar pronto - usandofrom x import y
. Isto é essencialmente o mesmo queO Python é capaz de detectar dependências circulares e impedir o loop infinito de importações. Essencialmente, tudo o que acontece é que um espaço reservado vazio é criado para o módulo (ou seja, não possui conteúdo). Após a compilação dos módulos circularmente dependentes, ele atualiza o módulo importado. Isso funciona mais ou menos assim.
Para que o python possa trabalhar com dependências circulares, você deve usar
import x
apenas o estilo.Como você não está mais se referindo ao conteúdo do módulo no nível superior, o python pode compilar o módulo sem precisar acessar o conteúdo da dependência circular. Por nível superior, quero dizer linhas que serão executadas durante a compilação, em oposição ao conteúdo das funções (por exemplo,
y = x.y
). Variáveis estáticas ou de classe que acessam o conteúdo do módulo também causarão problemas.fonte
Se você não quiser alterar a lógica, poderá colocar alguma instrução de importação que causou ImportError na outra posição do arquivo, por exemplo, no final.
a.py
b.py
Mas se mudarmos a posição de test.b import b2 em A, como abaixo:
a.py
E nós podemos obter o que queremos:
fonte
Esta é uma dependência circular. podemos resolver esse problema usando o módulo de importação ou classe ou função onde precisávamos. se usarmos essa abordagem, podemos corrigir a dependência circular
A.py
B.py
fonte
Acabei de receber esse erro também, por um motivo diferente ...
O script principal tinha finais de linha do Windows.
my_sub_module
teve terminações de linha UNIX. Mudá-los para serem os mesmos corrigiu o problema. Eles também precisam ter a mesma codificação de caracteres.fonte
Como já mencionado, isso é causado por uma dependência circular . O que não foi mencionado é que, quando você está usando o módulo de digitação Python e importa uma classe apenas para ser usada para anotar tipos , pode usar referências de encaminhamento :
e remova a dependência (a importação ), por exemplo, em vez de
Faz:
(observe a
import
declaração removida )fonte
Não nomeie seu script python atual com o nome de outro módulo que você importa
Solução: renomeie seu script python em funcionamento
Exemplo:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
ondemedicaltorch
deve ser um módulo instaladoIsso falhará com o
ImportError
. Apenas renomeie seu script python em funcionamento em 1.fonte
Ainda não o vejo aqui - isso é incrivelmente estúpido, mas certifique-se de importar a variável / função correta.
Eu estava recebendo esse erro
porque minha variável era realmente
IMPLICIT_TIMEOUT
.quando alterei minha importação para usar o nome correto, não recebi mais o erro 🤦♂️
fonte
from PIL import Pillow
não estava funcionando. ASe você está importando
file1.py
defile2.py
e usou isso:As variáveis abaixo disso em
file1.py
não podem ser importadas para,file2.py
porque__name__
não é igual__main__
!Se você deseja importar algo de
file1.py
parafile2.py
, precisará usá-lo emfile1.py
:Em caso de dúvida, faça uma
assert
declaração para determinar se__name__=='__main__'
fonte
Uma maneira de rastrear o erro de importação é passo a passo, tentando executar o python em cada um dos arquivos importados para rastrear um erro ruim.
você obtém algo como:
então você lança:
então você lança:
fonte
Também não é diretamente relevante para o OP, mas falhar em reiniciar um console PyCharm Python, após adicionar um novo objeto a um módulo, também é uma ótima maneira de obter uma solução muito confusa.
ImportError: Cannot import name ...
A parte confusa é que PyCharm irá completar automaticamente a importação no console, mas a importação, em seguida, falha.
fonte
O problema é claro: dependência circular entre nomes
entity
ephysics
módulos.Independentemente de importar o módulo inteiro ou apenas uma classe, os nomes devem ser carregados.
Veja este exemplo:
Isso será compilado em:
Com uma pequena alteração, podemos resolver isso:
Isso será compilado em:
fonte
No meu caso, eu estava trabalhando em um bloco de anotações Jupyter e isso estava acontecendo devido à importação já estar em cache desde que eu defini a classe / função dentro do meu arquivo de trabalho.
Eu reiniciei meu kernel Jupyter e o erro desapareceu.
fonte
Não especificamente para esse solicitante, mas esse mesmo erro será exibido se o nome da classe na sua importação não corresponder à definição no arquivo do qual você está importando.
fonte