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


320

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

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

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

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

문제가 발생한 코드를 제공해 주시겠습니까?
Evan Fosmark

그리고 어떤 버전의 파이썬을 사용하고 있습니까?
paxdiablo 2013

그리고 정규화는 파일 중 하나입니까, 아니면 타사입니까?
paxdiablo 2013

3
Hrm, 알았어. .py 파일을 옮길 때 오래 전에 남겨둔 오래된 .pyc 파일을 가져와야했기 때문에 새 버전을 가져올 수 있지만 이전 버전은 가져올 수 없습니다.
노아

1
이전 .pyc 파일을 도끼로 만들었으므로 편리하지는 않지만 가져 오기 경로에 문제가있었습니다. .py 파일을 사용하지 않으면 .py 파일을 사용하여 .pyc 파일을 다시 만들었을 것입니다.
노아

답변:


400

매직 번호는 파일의 처음 몇 바이트가 파일 유형을 나타내는 마커를 보유한 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

2
감사합니다.이 문제를 직접 파악하는 데 도움이되지는 않았지만 어쨌든 답을 아는 것이 좋습니다!
노아

pyc 파일이 문제를 일으키는 원인을 어떻게 확인할 수 있습니까? 모든 pyc 파일을 삭제했지만 여전히이 오류가 발생합니다.
sunprophit

pyc 파일이 이제 해당 폴더에 있으므로 'rm __pycache __ / * pyc'가 필요할 것입니다.
Arpad Horvath 2016 년

1
감사! ERROR : tornado.general : 'es'에 대한 번역을로드 할 수 없습니다 : [Errno 0] 잘못된 매직 번호 : '/app/locale/es/LC_MESSAGES/django.mo'. 실제로 * .mo가 올바르게 컴파일되지 않았습니다.
ericson.cepeda


60

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

find . -name "*.pyc" -delete

8
find . -name "*.pyc" -delete전달할 모든 파일 이름을 확장하면 공백 (및 명령 행이 너무 길음)에 문제가 있으므로을 사용하는 것이 좋습니다 rm.
Andrew Aylett

25
IMO는 매우 위험한 스크립트입니다. 패키지를 닫힌 소스로 유지하기 위해 .pyc 파일만으로 패키지를 제공 한 경우 어떻게됩니까? 죄송합니다. 애플리케이션을 삭제했습니다.
Dan Mantyla

3
아마 처음 실행 find . -name "*.pyc" -print한 다음 문제가 발생한 파일을 수동으로 삭제하거나 유감스러운 일이 없는지 확인한 후 위의 명령을 실행하는 것이 가장 좋습니다.
michael

9
@DanMantyla 비공개 소스 패키지는 어쨌든 삭제해야합니다.
고양이

25

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


3
이것은 답변이 아닌 의견 일 수 있습니다.
Kroltan

2
@ Kroltan 아직 답변으로 받아 들여진 것보다 낫습니다. 간결하고 요점.
Antony Hatchkins

@AntonyHatchkins 적어도 내 견해로는, 이것은 .pyc의 삭제를 제안하는 답변에 대한 의견 일 수 있습니다. 이것이 가능한 원인 일지라도 다른 해결책 이 없기 때문에 중복됩니다. 의견에 동의하지 않고 자유롭게 의견을 보내십시오.
Kroltan

@Kroltan 여기서 '고치는 방법'부분은 분명합니다. 그 이유는, 적어도 저에게는 정말 흥미로운 것입니다. 다른 python 2.x 버전으로 많은 문제를 겪었고 .pyc 버전간에 호환성이 없었습니다. 그리고이 솔루션은 그것이 python3 대 python2 문제라고 말합니다. 허용 된 답변에 정보가 없습니다. 게다가 나는 짧은 답변을 좋아합니다 (가능한 경우) :)
Antony Hatchkins

@AntonyHatchkins,이 솔루션은 py2 / 3 문제라고 말할 수도 있지만 그것은 단 하나의 가능성 뿐이며 , 그 문제에 대해서는 첫 번째 버전 이후로 승인 된 답변 (4 항)에서 제안 된 것입니다
:

6

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입니다.

2

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


1

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


1

__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'


0

이것은 위보다 훨씬 더 효율적입니다.

find {directory-of-.pyc-files} -name "*.pyc" -print0 | xargs -0 rm -rf

{directory-of-.pyc-files}컴파일 된 python 파일이 들어있는 디렉토리는 어디에 있습니까 ?


1
py 파일을 가지고있는 경우를 대비하여 python 설치를 다운 그레이드해야합니다.
레온 페도 토프

1
일부 경우에는 여전히 안전하지 않습니다. 또한 파일에 대해 이야기 할 때 왜 재귀 삭제를 수행합니까?
Jerome Baum

1
왜 두 가지 프로세스를 사용하고 있습니까? 발견은 삭제하지 않은 경우에도 실행할 수 있습니다find /dir -name "*.pyc" -exec rm '{}' ';'
mikemaccana

1
xargs rm에서 기본 -print final 연산자를 직접 사용하는 경우 공백이있는 파일 이름의 경우 'find'명령이 안전하게 작동하지 않습니다. 파이썬은 이와 같이 이름이 지정되지 않은 파일을 가져 오지 않지만, 스크립트는 여전히 이것을 중단시킬 수 있으며 삭제되지 않습니다. 일반적으로 find 명령 ( '|'파이프 기호 앞의 마지막 매개 변수로)에 여분의 -print0 (끝에 0)을 사용하고 xargs에있는 -0 옵션 (하이픈 + 0)을 사용하여- xargs로 파이프를 찾을 때 rm 명령 전에 print0 출력.
Breezer

0

내 경우에는 내 모듈의 이름을 바꾼 후 .pyc오래된 이진 .mo번역 파일이 아니기 때문에이 모듈 폴더 내에서 실행해야했습니다.

find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \;

(백업하고 .pyc파일을 먼저 수정 하십시오)


0

잘못된 python27.dll 파일 (Windows의 경우)이있는 경우에도 해당 dll 버전으로 python을 다시 설치하거나 추출하십시오. 나는 비슷한 경험을했다.


0

방금 Fedora26에서 같은 문제에 직면했습니다. 여기서 dnf와 같은 많은 도구가 6의 잘못된 마법 번호로 인해 손상되었습니다. 알 수없는 이유로 /usr/bin/six.pyc 파일에 예기치 않은 마법 번호가 있습니다. 이 파일을 삭제하면 문제가 해결됩니다.


0

제 경우 git clone에는 통역사 가 있는 lib가 있습니다.

#!/usr/bin/env python

반면 python에 이끌고 Python2.7내 주요 코드는 python3.6 실행에도 불구하고 ... 그것은 여전히 생성 *.pyc의 파일 2.7버전을 ...

나는이 오류가 아마도 2.7과 3+ 버전의 혼합의 결과라고 말할 수 있습니다.

  • 그 Python2x 코드를 조정하는 것을 잊지 마십시오-> python 3 ...

-1

삭제하지 마십시오 !!! 까지..........

git, svn 또는 copy 폴더에서 작동하는 버전을 찾으십시오.

그것들을 삭제하고 모든 .pyc를 복구하십시오.

그것은 나를 위해 일한 것입니다.


eyyy 왜 -1이 있습니까? 그것은 정말 나를 위해 작동하고 나는 정말 나쁜 상황에 있었다 ¬¬
lauralacarra

2
이전 버전으로 되 돌리는 것은 글로벌 솔루션이 아닙니다
ZiTAL

4
*.pyc파일을 커밋 하시겠습니까?
Manos Kounelakis

그것은 일반적인 오류입니다. git ignore 파일을 올바르게 구성하지 않으면. 그래서 나는 해결책을 제시하고 당신은 자식을 주문해야합니다.
lauralacarra

-1

환경에있는 모든 경로에서이 명령을 실행해야합니다.

>>> import sys
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/source_code/src/python', '/usr/lib/python3/dist-packages']

그런 다음 모든 디렉토리에서 명령을 실행하십시오.

find /usr/lib/python3.6/ -name "*.pyc" -delete
find /usr/local/lib/python3.6/dist-packages -name "*.pyc" -delete
# etc...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.