Python

ImportError: bad magic number in "": b'\x03\xf3\r\n’

비번변경 2022. 2. 14. 23:23

python으로 작성한 코드를 실행시키려고 할 때 아래와 같은 메시지가 나오면서 에러가 발생한 적이 있다.

ImportError: bad magic number in "": b'\x03\xf3\r\n’

Python(CPython)에서 사용하는 바이트 코드(.pyc)에 문제가 있어 발생한 에러이므로, 해당 바이트 코드를 삭제하는 것으로 문제를 해결할 수 있다.

 

명령어

find . -name "*.pyc" -exec rm -f {} \;

# 또는
find . -name \*.pyc -delete

 


개념적인 내용

위의 에러는 Python 컴파일 과정과 관련이 있는 것 같아 내용을 정리해둔다.

CPython

Python은 일반적으로 C로 구현되어 있다고 알려져 있는데, 그 구현체를 CPython이라고 한다. 가장 처음으로 만들어진 구현체이며 표준 구현에 해당한다.

CPython은 인터프리터이면서 컴파일러로, 개발자가 작성한 Python 코드를 컴파일하여 PVM(Python Virtual Machine)이 이해할 수 있는 bytecode로 변환하여 인터프리터(PVM)로 실행한다.

CPython 인터프리터
https://www.c-sharpcorner.com/article/why-learn-python-an-introduction-to-python/

.pyc

CPython이 컴파일한 bytecode이다.

컴파일이 오래 걸리기 때문에 컴파일 결과를 임시 파일(.pyc)로 저장해 두고, 그 이후부터는 저장해둔 임시파일을 사용해 코드를 실행할 수 있도록 하기 위함이다. 다만 bytecode가 python 버전마다 다르기 때문에 호환성에 문제가 있을 수 있다.

컴파일한 .pyc 파일은 __pycache__ 디렉터리 내에 저장된다.

UNIX의 경우 처음 몇 Byte를 Magic Number라는 파일의 형식을 식별하기 위한 값으로 사용한다.
CPython도 이와 비슷하게 .pyc 파일을 식별하기 위해 Magic Number를 사용한다.
따라서 .pyc 파일을 편집하거나 pyc 인터프린터와 다른 인터프린터로 코드를 실행하게 되면 bad magic number라는 ImportError가 발생할 수 있다.

 


참고 문서

https://cjh5414.github.io/about-python-and-how-python-works/

https://jins-sw.tistory.com/25