2012-08-29 30 views
2

我剛剛發現(A)一個ZIP文件可以直接作爲Python二進制文件的script參數(其中通常.py文件將被傳遞)和(B)ZIP文件可以有任何後綴,即使.py被識別爲一個ZIP文件(至少在Mac OS X上從命令行和Windows上從命令行和GUI,它似乎工作)。執行此操作的全部內容記錄在this issue中。Python解釋器如何檢測到它是用ZIP壓縮文件而不是源文件調用的?

這似乎非常吸引人的Python應用程序的分佈,其中安裝程序是不受歡迎的,它具有我們的用戶習慣於的.jar存檔(不需要安裝,可以通過電子郵件發送,無需進一步存檔)的相同的使用特徵。命名ZIP檔案.py(或.pyw)啓用此行爲,而無需在客戶機上進行任何配置,除了安裝Python。

我的問題是,我只能找到(A)我的研究結果的文件,但不是部分(B)。所以我的第一個問題是,Python如何檢測作爲script參數傳遞的文件是ZIP壓縮文件而不是Python源文件?是否有任何可能隨機破解的啓發式算法當ZIP存檔包含一些特殊內容時(例如,看起來像Python代碼的未壓縮文件)?

第二個問題是當應用程序攜帶大量非代碼數據文件(數十MB)時,這種方法是否存在任何缺點,除了這些文件的訪問不透明外。如果ZIP文件很大和/或包含大量文件,我正在考慮更長的ZIP文件檢測時間。

更新

所有答案到現在爲止(約阿希姆·紹爾的,基思·蘭德爾和好奇的)是可悲的都錯了。 Zip規範沒有規定ZIP文件必須以特定標題開頭。一個Zip文件可以擁有任何數據,並且仍然是一個有效的Zip文件(這是自解壓Zip文件如何在文件以windows EXE頭開始,而不是Zip特定的任何地方工作的地方)。這在Curious的答案中鏈接的頁面中有解釋。

我在猜測,Python解釋器尋找Zip中心目錄,如果有的話,該文件被用作Zip文件而不是Python源文件。有沒有人想在他/她的回答中包含這個,所以我可以接受它?

回答

2

所有ZIP文件(以及所有派生格式,如.jar文件)start with the ASCII characters "PK"(以及另外兩個字節不會生成有意義的ASCII字符)。

這些被稱爲magic numbers,是缺乏外部信息(文件擴展名或MIME類型)時檢測文件類型的常用方法。

由於只需要讀取第一個字節,因此檢測文件是否爲ZIP文件的速度同樣快,無論文件的大小如何。檢測ZIP文件是否爲正確未損壞是一個不同的問題,但通常不會完成,除非明確要求。

1

Zip文件通常不會被文件擴展名識別,而是被文件開頭的magic number識別。前4個字節總是0x50 0x4b 0x03 0x04

相關問題