2017-05-01 1 views
0

다음 코드는 선형 방정식 해결사의 일부입니다. 이것은 파이썬 3 용으로 작성되었습니다. 프로그램을 실행하기 전에 마법 값을 imp.get_magic()에서 예상 값과 비교하여 검사합니다.Python 3.5.0에서 예기치 않은 마법 번호가 표시됨

필자는 Fedora 25를 실행하는 시스템에 Python 3.5.0을 설치했습니다. 문제는 내 시스템에서 매직 번호에 다른 값을 얻는 것입니다. 예상

는 대신 b'\xf8\x0c\r\n'

, 내가 얻을 : 여기

b'\x16\r\r\n' 코드입니다

def _get_module(): 
    del globals()['_get_module'] 
    import imp 
    import base64 
    import marshal 

    magic = imp.get_magic() 
    if magic == b'\xf8\x0c\r\n': # Python 3.5 
     pycData = <certain value> 
    pycData = base64.decodebytes(pycData) 

나는 마법의 숫자에 대해 다른 값을 얻을 수 있기 때문에,이 프로그램을 실행할 수 없습니다 프로그램.

이 코드는 책 Coding the Matrix의 자료입니다. "The Matrix"섹션에서 찾을 수 있으며 파일의 이름은 solver.py (파일 다운로드)입니다.

이 작업을 수행 할 수있는 방법이 있습니까?

+0

글쎄, 조건부를 true로 설정할 수는 없습니까? 어쨌든이 코드는 무엇이라고 생각합니까? – user1685095

+1

오, 이런 스크립트는 파이썬 버전의 매직 넘버에 키가 삽입 된 바이트 코드를 포함하고 있습니다. 무엇이 잘못 될 수 있습니까? –

+0

@MartijnPieters OS와 관련이 있습니까? – dpk

답변

2

바이트 코드가 바뀔 때마다 매직 번호가 업데이트되어 이전 버전과 호환되지 않는 바이트 코드를 이전 인터프리터로로드하지 않도록합니다.

그 코드가 보이는 특정 매직 볼, 파이썬 3.5a0의 하나 인 changelog for markers :

>>> int.from_bytes(b'\xf8\x0c', 'little') 
3320 

나중에 3.5b2 이상에서이 문제를로드하는 동안 (그러나 3.5.2 이전) :

>>> int.from_bytes(b'\x16\r', 'little') 
3350 

해당 버전을 3.5.2로로드하면됩니다. 마커 마커 테스트를 비활성화하거나 마커를 추출하기 위해 코드를 다시 작성하고 (위의 첫 번째 두 바이트처럼) 가능한 최대 값을 찾습니다.

왜 코드가 단지 .pyc 파일을 배포하는 것이 아닌지 잘 모르겠습니다. Python 3.3 바이트 코드는 Python 3.6에 정상적으로로드됩니다. 파이썬 3.6에 모든 버전을로드했고, 각각 dis.dis()을 실행했고 은 바이트 코드에 실제 차이가 없음을 발견했습니다.

+0

python 3.5.2와 함께 제공되는 fedora 25를 사용하고 있습니다.이 질문에 대한 답변 (http://stackoverflow.com/questions/13661487/uninstall-old- version-python-fedora는 시스템이 손상 될 수 있다고 경고합니다. 그래서 3.5.0을 기존 버전에 설치했는데, IDLE 쉘과 파이썬 터미널은 버전을 3.5.0으로 표시합니다. 3.5.2 버전에 대해 당신이 옳았습니다. 그것은 제가 시스템에서 가지고 있던 것입니다. – dpk

+0

이전 바이트 코드 버전은 * 괜찮습니다. 그들은 당신의 시스템을 깰하지 않습니다. –

+0

다른 게시물은 시스템 파이썬 2를 파이썬 3으로 대체하는 것에 대해 경고합니다. 실제로 문제가 될 수 있지만 두 가지 모두 설치하면 쉽게 피할 수 있습니다.그 문제는 여기에 적용되지 않습니다. –

관련 문제