[python] 잘못된 매직 넘버 오류는 무엇입니까?

파이썬의 “나쁜 마법 번호”ImportError는 무엇이며 어떻게 수정합니까?

내가 온라인에서 찾을 수있는 유일한 것은 이것이 .py-> .pyc 파일을 컴파일 한 다음 잘못된 버전의 python과 함께 사용하려고 시도했기 때문입니다. 그러나 필자의 경우 파일은 잘 가져 오는 것으로 보이지만 다른 파일은 가져 오지 않는 것 같습니다. 왜 그런지 잘 모르겠습니다.

파이썬이 트레이스 백에서 제공하는 정보는 특별히 도움이되지 않지만 (여기서 묻는 이유는 …) 여기 도움이되는 경우입니다.

Traceback (most recent call last):
  File "run.py", line 7, in <module>
    from Normalization import Normalizer



답변

매직 번호는 파일의 처음 몇 바이트가 파일 유형을 나타내는 마커를 보유한 UNIX 유형 시스템에서 나옵니다.

파이썬은 pyc파일을 만들 때 비슷한 마커를 파일에 넣 습니다.

그런 다음 파이썬 인터프리터는이 숫자를로드 할 때 올바른지 확인합니다.

이 매직 넘버를 손상시키는 것은 문제를 일으킬 것입니다. 여기에는 pyc파일을 편집 하거나 pyc인터프리터와 다른 버전의 파이썬 (보통 나중에)에서 실행하려고하는 것이 포함됩니다 .

그것들이 당신의 pyc 파일 이라면, 그것들을 삭제하고 인터프리터가 py파일을 다시 컴파일하게 하십시오. UNIX 유형 시스템에서는 다음과 같이 간단 할 수 있습니다.

rm *.pyc

또는:

find . -name '*.pyc' -delete

그들이 당신의 것이 아닌 경우, py재 컴파일을 위해 파일을 가져 오거나 pyc해당 특정 마법 값으로 파일을 실행할 수있는 인터프리터를 가져와야합니다.

간헐적 인 성격을 유발할 수있는 한 가지. pyc문제를 일으키는 것을는 특정 조건 하에서 만 수입 할 수있다. 때때로 가져올 가능성은 거의 없습니다. 가져 오기가 실패 할 때 실제 전체 스택 추적을 확인해야합니까?

여담으로, 내 모든의 첫 번째 단어 2.5.1(r251:54863) pyc파일은 62131, 2.6.1(r261:67517)이다 62161. 모든 매직 넘버의 목록은에서 찾을 수 있으며 Python/import.c완전성을 위해 여기에 재현되어 있습니다 (답변이 게시 된 시점부터 현재까지 변경되었을 수 있음).

1.5:   20121
1.5.1: 20121
1.5.2: 20121
1.6:   50428
2.0:   50823
2.0.1: 50823
2.1:   60202
2.1.1: 60202
2.1.2: 60202
2.2:   60717
2.3a0: 62011
2.3a0: 62021
2.3a0: 62011
2.4a0: 62041
2.4a3: 62051
2.4b1: 62061
2.5a0: 62071
2.5a0: 62081
2.5a0: 62091
2.5a0: 62092
2.5b3: 62101
2.5b3: 62111
2.5c1: 62121
2.5c2: 62131
2.6a0: 62151
2.6a1: 62161
2.7a0: 62171


답변

모든 .pyc 파일을 삭제하면 “Bad Magic Number”오류가 해결됩니다.

find . -name "*.pyc" -delete


답변

*.pycpython2 로 python3 생성 파일을 로드 하면이 오류가 발생합니다.


답변

pyc 파일을 Windows 시스템으로 가져 가십시오. 16 진수 편집기를 사용하여이 pyc 파일을여십시오. 프리웨어 ‘HexEdit’을 사용했습니다. 이제 처음 2 바이트의 16 진 값을 읽으십시오. 제 경우에는 03 f3입니다.

계산을 열고 디스플레이 모드를 프로그래머 (XP의 과학)로 변환하여 16 진 및 10 진 변환을보십시오. 라디오 버튼에서 “Hex”를 선택하십시오. 먼저 두 번째 바이트로 값을 입력 한 다음 첫 번째 바이트로 입력하십시오. 예를 들어 f303 “Dec”(Decimal) 라디오 버튼을 클릭하십시오. 표시된 값은 매직 넘버 일명 파이썬 버전에 해당하는 값입니다.

따라서 이전 답변에 제공된 표를 고려하면

  • 1.5 => 20121 => 4E99이므로 파일의 첫 바이트는 99이고 두 번째 바이트는 4e입니다
  • 1.6 => 50428 => C4FC이므로 파일의 첫 바이트는 fc이고 두 번째 바이트는 c4입니다.

답변

확장명이 .pyc 인 파일의 이름을 수동으로 지정한 경우 “잘못된 매직 번호”오류도 발생합니다.


답변

아주 오래된 (1.5.2) 구현을 사용하여 이상한 Magic Number 오류가 발생했습니다. .pyo 파일을 생성했으며 오류가 발생했습니다. 기 묘하게도 문제는 모듈 이름을 변경하여 해결되었습니다. 문제의 이름은 sms.py입니다. 해당 모듈에서 sms.pyo를 생성하면 Bad Magic Number 오류가 발생했습니다. 이름을 smst.py로 변경하면 오류가 사라졌습니다. sms.py가 같은 이름의 다른 모듈을 방해하는지 확인하기 위해 앞뒤로 확인했지만 이름 충돌을 찾을 수 없었습니다. 이 문제의 원인이 여전히 미쳤지 만 모듈 이름을 변경하는 것이 좋습니다.


답변

__init__.py디렉토리에서 파일 이 누락 되었기 때문일 수도 있습니다 . 단위 테스트를 여러 파일로 분리하기 위해 django에 새 디렉토리를 작성하고 하나의 디렉토리에 배치하면 __init__.py새로 작성된 테스트 디렉토리의 다른 모든 파일 옆에 파일 을 작성해야한다고 가정하십시오 . 그렇지 않으면 다음과 같은 오류가 발생할 수 있습니다

Traceback (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'