2

script(A) Python バイナリのパラメーター (通常は.pyファイルが渡される場所) として ZIP ファイルを直接渡すことができ、(B) ZIP ファイルは.py、ZIP として認識される場合でも、任意のサフィックスを付けることができることがわかりました。ファイル (少なくとも Mac OS X ではコマンド ラインから、Windows ではコマンド ラインと GUI から、動作するようです)。これを実装する全体のストーリーは、この問題で文書化されています。

これは、インストーラーが望ましくなく.jar、ユーザーが慣れ親しんでいるアーカイブ (インストールは不要、さらにアーカイブせずに電子メールで送信できる) と同じ使用特性を持つ Python アプリケーションのディストリビューションにとって非常に魅力的です。ZIP アーカイブ.py(または.pyw) に名前を付けると、Python のインストール以外にクライアント マシンで構成を行わなくても、この動作が可能になります。

私の問題は、調査結果の一部 (A) のドキュメントのみを見つけることができ、部分 (B) のドキュメントを見つけることができないことです。私の最初の質問は、scriptパラメータとして渡されたファイルが Python ソース ファイルではなく ZIP アーカイブであることを Python がどのように検出しているのかということです。ZIP アーカイブに特別なコンテンツ (Python コードのように見える非圧縮ファイルなど) が含まれている場合など、ランダムに破損する可能性のあるヒューリスティックはありますか?

2 番目の質問は、アプリケーションが多数の非コード データ ファイル (数十 MB) を持ち歩いている場合、これらのファイルへのアクセスが透過的でないという事実を除けば、このアプローチに欠点があるかどうかです。ZIP ファイルが大きい場合や多数のファイルが含まれている場合、ZIP ファイルの検出に時間がかかることを考えています。

アップデート

これまでのすべての回答 (Joachim Sauer、Keith Randall、Curious) は残念ながらすべて間違っています。Zip 仕様では、ZIP ファイルを特定のヘッダーで開始する必要はありません。Zip ファイルは、任意のデータを先頭に追加しても、有効な Zip ファイルであることができます (これは、ファイルが Windows EXE ヘッダーで始まり、Zip 固有のものではない場合に、自己解凍型 Zip ファイルが機能する方法です)。これは、Curious's answer にリンクされているページで説明されています。

Python インタープリターが Zip 中央ディレクトリを探し、存在する場合、ファイルは Python ソース ファイルではなく Zip ファイルとして使用されると推測しています。私がそれを受け入れることができるように、誰かが彼/彼女の答えにこれを含めたいですか?

4

2 に答える 2

2

すべてのZIPファイル(および.jarファイルなどのすべての派生形式)は、ASCII文字「PK」(および意味のあるASCII文字にならないさらに2バイト)で始まります。

これらはマジックナンバーと呼ばれ、外部情報(ファイル拡張子またはmimeタイプ)がない場合にファイルタイプを検出する一般的な方法です。

読み取る必要があるのは最初のバイトだけなので、アーカイブのサイズに関係なく、ファイルがZIPファイルであるかどうかの検出も同様に高速です。ZIPファイルが正しく破損していないかどうかを検出することは別の問題ですが、明示的に要求されない限り、通常は実行されません。

于 2012-08-29T07:15:38.040 に答える
1

Zipファイルは通常、ファイル拡張子では認識されませんが、ファイルの先頭にあるマジックナンバーで認識されます。最初の4バイトは常に0x50 0x4b 0x03 0x04です。

于 2012-08-29T07:16:44.267 に答える