2017-10-23 1 views

답변

2

.pyc.pyo 파일은 단지 캐시 된 바이트 코드입니다. 파이썬의 임포트 기계는 문자열을 중심으로 만들어지며, 이로 인해 가져 오기를 실행하는 코드가 가져온 라이브러리와 분리됩니다.

이러한 파일은 소스 코드 자체보다 가져 오는 라이브러리 버전에 더 이상 종속되지 않습니다. 소스 코드가 다양한 버전의 라이브러리에서 작동하는 경우 컴파일 된 바이트 코드도 함께 작동합니다.

항상 파이썬이 생성하는 바이트 코드를 dis module으로 볼 수 있습니다. 직선 업 import 문이된다 :

>>> compile('import numpy as np', '', 'single').co_names 
('numpy', 'np') 

그렇지 않은 :

>>> import dis 
>>> dis.dis(compile('import numpy as np', '', 'single')) 
    1   0 LOAD_CONST    0 (0) 
       2 LOAD_CONST    1 (None) 
       4 IMPORT_NAME    0 (numpy) 
       6 STORE_NAME    1 (np) 
       8 LOAD_CONST    1 (None) 
      10 RETURN_VALUE 

IMPORT_NAME opcode은 (너무 캐시에 저장) 코드 객체에 부착 된 co_names 구조에서 이름을 따 여기서 numpy 모듈은 동적으로로드되는 라이브러리의 큰 부분으로 구성됩니다. 이름을numpy으로 바꾸면 대신 가져올 수 있습니다. 모듈은 컴파일 시간이 아니라 런타임에로드됩니다.

4

컴파일 된 바이트 코드 인 경우에도 모듈의 이름은 여전히 ​​문자열입니다. 모듈의 인터페이스가 호환되는 한, 코드는 여전히 다른 모듈 버전에서 작동합니다.

+0

그러나 이것은 기본 Python 런타임의 버전을 변경하는 것으로 확장되지 않습니다. 파이썬 버전이 생성 된 파일 이름에 포함되어있을뿐만 아니라 파일 자체 내에 버전 호환성 마커가 있습니다 (참고 : 원래의 덧글은 질문을 오독하는 것을 기반으로했습니다. – ncoghlan

+0

죄송합니다. 질문을 잘못 읽었습니다. 다시 파이썬 버전을 변경하는 것도 고려했습니다. (다시 컴파일해야 할 필요가있는 부분입니다) – ncoghlan