2012-08-29 2 views
2

방금 ​​(A) ZIP 파일을 script 매개 변수 (일반적으로 .py 파일이 전달되는 곳)로 전달할 수 있고 (B) ZIP 파일은 어떤 접미사라도 가질 수 있음을 알게되었습니다. .py까지도 가능합니다. ZIP 파일로 인식 될 수 있습니다 (적어도 명령 줄에서 Mac OS X, 명령 줄에서 Windows로, 그리고 GUI에서 작동하는 것 같습니다). 이를 구현하는 모든 이야기는 this issue에 설명되어 있습니다.Python 인터프리터는 소스 파일 대신 ZIP 아카이브를 사용하여 호출 한 것을 어떻게 감지합니까?

이것은 설치 프로그램이 바람직하지 않으며 사용자가 익숙한 .jar 아카이브 (설치가 필요없고 추가 보관없이 전자 메일로 보낼 수 있음)와 동일한 사용 특징을 갖는 Python 응용 프로그램 배포에 매우 적합합니다. . ZIP 보관 파일 이름을 .py (또는 .pyw)으로 지정하면 Python 설치 이외의 클라이언트 컴퓨터에서 구성하지 않고도이 동작을 수행 할 수 있습니다.

내 문제는 내가 발견 한 부분 만 문서화 할 수 있지만 부분적 (B) 문서는 찾을 수 없다는 것입니다. 그래서 첫 번째 질문은 파이썬이 script 매개 변수로 전달 된 파일이 파이썬 소스 파일이 아닌 ZIP 아카이브라는 것을 어떻게 감지 했는가하는 것입니다. 예를 들어 임의로 끊어지는 휴리스틱이 포함되어 있습니까? ZIP 보관 파일에 특수한 내용 (예 : Python 코드와 같은 압축되지 않은 파일)이 포함되어 있습니까?

두 번째 질문은 이러한 파일에 대한 액세스가 투명하지 않다는 점을 제외하고 응용 프로그램이 많은 비 코드 데이터 파일 (수십 MB)을 운반 할 때이 접근법에 단점이 있는지 여부입니다. ZIP 파일이 크고 파일이 많이 포함되어 있으면 ZIP 파일 탐지가 오래 걸릴 것으로 생각하고 있습니다.

업데이트

모든 답변까지 지금은 (요아힘 사우어의, 키스 랜달의 호기심의)는 슬프게도 모든 잘못입니다. 우편 번호 지정은 우편 번호가 특정 헤더로 시작해야한다는 것을 요구하지 않습니다. Zip 파일은 임의의 데이터를 앞에두고 유효한 Zip 파일 일 수 있습니다 (이 방법은 자동 압축 풀림 Zip 파일이 파일이 Windows EXE 헤더로 시작하고 Zip 특정 파일로 시작하지 않는 곳에서 작동합니다). 이것은 궁금증의 답변에 링크 된 페이지에서 설명됩니다.

저는 Python 인터프리터가 Zip 중앙 디렉토리를 찾은 것 같아요. 파이썬 인터프리터가 있다면 파이썬 소스 파일 대신 Zip 파일로 사용됩니다. 누구든지 그/그녀의 대답에 이것을 포함시키고 싶어 그래서 그것을 받아 들일 수 있습니까?

답변

2

모든 ZIP 파일 (및 .jar 파일과 같은 모든 파생 형식) start with the ASCII characters "PK" (의미있는 ASCII 문자를 만들지 않는 2 바이트 더).

이러한 파일을 magic numbers이라고하며 외부 정보 (파일 확장자 또는 MIME 형식)가없는 경우 파일 형식을 감지하는 일반적인 방법입니다.

첫 번째 바이트 만 읽어야하므로 파일이 ZIP 파일인지 여부는 아카이브의 크기와 상관없이 똑같습니다. ZIP 파일이 인 경우 올바른이 아닌 것으로 확인되면은 다른 문제이지만 명시 적으로 요청하지 않는 한 일반적으로 수행되지 않습니다.

1

일반적으로 Zip 파일은 파일 확장자로 인식되지 않지만 파일 시작 부분에 magic number으로 인식됩니다. 처음 4 바이트는 항상 0x50 0x4b 0x03 0x04입니다.