O que é o ImportError "Número mágico incorreto" em python e como corrigi-lo?
A única coisa que posso encontrar online sugere que isso é causado pela compilação de um arquivo .py -> .pyc e, em seguida, tentando usá-lo com a versão errada do python. No meu caso, no entanto, o arquivo parece importar bem algumas vezes, mas não outras, e não sei por que.
As informações que o python fornece no traceback não são particularmente úteis (e é por isso que eu estava perguntando aqui ...), mas aqui está, caso ajude:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
Respostas:
O número mágico vem de sistemas do tipo UNIX, nos quais os primeiros bytes de um arquivo mantinham um marcador indicando o tipo de arquivo.
Python coloca um marcador semelhante em seus
pyc
arquivos quando os cria.Em seguida, o intérprete python garante que esse número esteja correto ao carregá-lo.
Qualquer coisa que danifique esse número mágico causará seu problema. Isso inclui editar o
pyc
arquivo ou tentar executar umpyc
de uma versão diferente do python (geralmente mais tarde) que o seu intérprete.Se forem seus
pyc
arquivos, exclua-os e deixe o intérprete recompilar ospy
arquivos. Em sistemas do tipo UNIX, isso pode ser algo tão simples quanto:ou:
Se eles não forem seus, você precisará obter os
py
arquivos para recompilação ou um intérprete que possa executar ospyc
arquivos com esse valor mágico específico.Uma coisa que pode estar causando a natureza intermitente. O problema
pyc
que está causando o problema pode ser importado apenas sob certas condições. É altamente improvável que às vezes seja importado. Você deve verificar o rastreamento de pilha completa real quando a importação falhar?Como um aparte, a primeira palavra de todos os meus
2.5.1(r251:54863)
pyc
arquivos é62131
,2.6.1(r261:67517)
é62161
. A lista de todos os números mágicos pode ser encontradaPython/import.c
aqui, reproduzida aqui para ser completa (atual, no momento em que a resposta foi postada, ela pode ter sido alterada desde então):fonte
A exclusão de todos os arquivos .pyc corrigirá o erro "Número mágico inválido".
fonte
find . -name "*.pyc" -delete
, pois você terá problemas com espaços (e possivelmente com uma linha de comando muito longa) se expandir todos os nomes de arquivos para os quais passarrm
.find . -name "*.pyc" -print
e só então excluir os arquivos problemáticos manualmente e / ou executar o comando acima, depois de verificar se você não está fazendo algo lamentável.Carregar um
*.pyc
arquivo gerado em python3 com python2 também causa esse erro.fonte
Leve o arquivo pyc para uma máquina Windows. Use qualquer editor Hex para abrir este arquivo pyc. Eu usei o freeware 'HexEdit'. Agora leia o valor hexadecimal dos dois primeiros bytes. No meu caso, eram 03 f3.
Abra o calc e converta seu modo de exibição para Programmer (Scientific in XP) para ver a conversão Hex e Decimal. Selecione "Hex" no botão de opção. Insira os valores como segundo byte primeiro e depois o primeiro byte, ou seja, f303 Agora clique no botão de opção "Dec" (decimal). O valor exibido é aquele que corresponde ao número mágico, também conhecido como versão do python.
Portanto, considerando a tabela fornecida na resposta anterior
fonte
O erro "número mágico inválido" também ocorre se você tiver nomeado seu arquivo manualmente com uma extensão .pyc
fonte
Eu tive um caso estranho de erro de Bad Magic Number usando uma implementação muito antiga (1.5.2). Eu gerei um arquivo .pyo e isso acionou o erro. Estranhamente, o problema foi resolvido alterando o nome do módulo. O nome ofensivo era sms.py. Se eu gerar um sms.pyo a partir desse módulo, o erro Bad Magic Number foi o resultado. Quando mudei o nome para smst.py, o erro desapareceu. Eu verifiquei para frente e para trás para ver se o sms.py de alguma forma interferia em qualquer outro módulo com o mesmo nome, mas não encontrei nenhuma colisão de nomes. Embora a origem desse problema permaneça um mistério para mim, recomendo tentar uma alteração no nome do módulo.
fonte
Isso também pode ocorrer devido à falta de
__init__.py
arquivo no diretório. Digamos que se você criar um novo diretório no django para separar os testes de unidade em vários arquivos e colocá-los em um diretório, também será necessário criar o__init__.py
arquivo ao lado de todos os outros arquivos no novo diretório de teste criado. caso contrário, pode dar erro comoTraceback (most recent call last): File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python35\Lib\unittest\loader.py",line 153, in loadTestsFromName module = __import__(module_name) ImportError: bad magic number in 'APPNAME.tests': b'\x03\xf3\r\n'
fonte
Isso é muito mais eficaz do que acima.
onde
{directory-of-.pyc-files}
é o diretório que contém os arquivos python compilados.fonte
find /dir -name "*.pyc" -exec rm '{}' ';'
No meu caso, não eram mais do que arquivos de tradução
.pyc
binária antigos.mo
depois que renomeei meu próprio módulo, portanto, dentro desta pasta do módulo, tive que executar(faça backup e tente corrigir os
.pyc
arquivos primeiro)fonte
Isso também pode acontecer se você tiver o arquivo python27.dll errado (no caso do Windows), para resolver isso basta reinstalar (ou extrair) o python com a versão exata da dll correspondente. Eu tive uma experiência parecida.
fonte
Eu apenas enfrentei o mesmo problema com o Fedora26, onde muitas ferramentas como o dnf foram quebradas devido ao número mágico ruim para seis. Por um motivo desconhecido, eu tenho um arquivo /usr/bin/six.pyc, com o número mágico inesperado. A exclusão deste arquivo corrige o problema
fonte
No meu caso, eu tenho
git clone
uma biblioteca que tinha um intérprete deEmbora
python
estivesse levandoPython2.7
embora meu código principal estivesse sendo executado com python3.6 ... ele ainda criou um*.pyc
arquivo para a2.7
versão ...Posso dizer que esse erro provavelmente é resultado de uma mistura entre as versões 2.7 e 3+, é por isso que a limpeza (de qualquer forma que você possa pensar que está usando) - ajudará aqui ...
fonte
Não os apague !!! Até..........
Encontre uma versão na sua pasta git, svn ou copy que funcione.
Exclua-os e depois recupere todos os .pyc.
Isso é trabalho para mim.
fonte
*.pyc
arquivos?Você precisará executar este comando em todos os caminhos existentes em seu ambiente.
Em seguida, execute o comando em todos os diretórios aqui
fonte