PYC ファイル形式とは?
.pyc ファイルは、Python プログラミング言語で使用されます。.pyc ファイルは、Python ソースで書かれたプログラムの コンパイル済みバイトコード を含む実行可能ファイルです。バイトコードは、起動のたびに元のソースを再解析することなくインタープリタがプログラムを実行するための命令セットであり、インポートや起動時間を短縮します。
.pyc ファイルは、関連する .py ソースファイルに付随します。Python は .py ファイルをコンパイルして結果を .pyc ファイルに保存し、それを使用してプログラムを直接実行できます。Python 3.2 以降、これらのキャッシュファイルはソースと同じ場所にある __pycache__ サブディレクトリに配置され、ファイル名にはインタープリタのバージョンが埋め込まれます(例:script.cpython-312.pyc)。
各 .pyc ファイルは 16 バイトのヘッダーで始まります。最初の 2 バイトはバージョン固有の「マジックナンバー」であり、CPython のリリースごとに変わります。続いてバイト 2-3 に 0x0D 0x0A (CR LF) が配置されます。残りのヘッダーバイトには、ソースファイルのタイムスタンプとサイズ(デフォルト)、または決定論的で再現可能なビルドのためのソースファイルハッシュ(Python 3.7 の PEP 552 で導入されたスキーム)が保持されます。ヘッダーの後には、Python の組み込み dis モジュールで検査可能なマーシャル化されたコードオブジェクトが含まれています。
.pyc バイトコードは特定の CPython バージョンに紐付けられています。例えば Python 3.11 でコンパイルされたファイルは Python 3.12 ではロードされません。古い .pyo 最適化バイトコード形式は Python 3.5 で削除されました。現在は最適化ビルドを行うと、代わりに .opt-1.pyc や .opt-2.pyc ファイルが生成されます。.pyc を読み取り可能なソースにデコンパイルするには、uncompyle6、decompyle3、pycdc (Decompyle++) などのツールが一般的に使用されますが、互換性は Python バージョンによって異なります。Windows では、コンパイルされた拡張モジュールは関連する .pyd 形式を使用します。
セキュリティと安全性
リスク: MEDIUM.pyc は Python インタープリタが「実行」するバイトコードであるため、悪意のある .pyc はスクリプトと同様に任意のコードを実行できます。信頼できないソースからの .pyc は決して実行しないでください。また、マルウェアを隠す手法(コンパイル済みバイトコードのみを配布する)としても一般的です。逆に、自身のコードを .pyc として配布しても保護は非常に弱いです。デコンパイルが可能ですし、少なくとも同梱の «dis» モジュールで逆アセンブルできるため、ソースを秘密にするための真の方法ではありません。__pycache__ や .pyc ファイルの削除は安全です。Python が .py ソースから自動的に再生成します。
形式の詳細
概要PYC ファイルを開くプログラム
pycdc をビルドして «pycdc file.pyc» を実行します。ベストエフォート型であり、最新バージョンでの精度には限りがあります。 技術的詳細
詳細仕様| 開発元 | Python Software Foundation (CPython) |
| MIME タイプ | application/x-python-code |
| ファイル構造 | バイナリ - バージョン管理された 16 バイトのヘッダーと、それに続くマーシャル化された Python コードオブジェクト |
| マジックナンバー | バイト 0-1: バージョン固有の 2 バイト値(CPython リリースごとに異なる)、バイト 2-3: 常に 0x0D 0x0A (CR LF) |
| ヘッダーレイアウト | 32ビットのマジック、32ビットのビットフィールドフラグ、続いて 32ビットの mtime + 32ビットのソースサイズ(タイムスタンプモード)または 32ビットのソースハッシュ(PEP 552 ハッシュモード) |
| キャッシュディレクトリ | Python 3.2 以降は __pycache__/ に保存。ファイル名にはインタープリタのバージョンが含まれる(例:script.cpython-312.pyc) |
| バージョンの互換性 | CPython の各バージョンは固有のマジックナンバーを書き込む。Python 3.11 の .pyc は 3.12 ではロードされず、その逆も同様 |
| プラットフォームの移植性 | 同じ CPython バージョン内であればプラットフォームに依存しない。同じ .pyc が Windows、macOS、Linux 上の一致するインタープリタで動作する |
| 最適化バリアント | python -O および python -OO は .opt-1.pyc および .opt-2.pyc を生成(アサートやドキュメント文字列を削除)。.pyo 拡張子は Python 3.5 で廃止 |
| 自動生成の制御 | CPython はインポート時に .pyc ファイルを自動的に書き込む。-B フラグまたは PYTHONDONTWRITEBYTECODE=1 環境変数で抑制可能 |
| 逆アセンブル / デコンパイル | Python 組み込みの dis モジュールがバイトコードを逆アセンブルする。サードパーティツールの uncompyle6、decompyle3、pycdc (Decompyle++) はソースの再構築を試みる |
| 内部シリアル化形式 | コードオブジェクトは marshal モジュールでシリアル化される。これは pickle とは異なるコンパクトなバイナリ形式であり、安定した公開 API の一部ではない |
| ハッシュベースのビルド | PEP 552 (Python 3.7+) でハッシュベースの .pyc ファイルが導入。再現可能なビルドのために、ヘッダーに mtime ではなくソースファイルのハッシュを保存する |
| リリース日 | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| オープンスタンダード | はい · ロイヤリティフリー |
| 仕様書 | docs.python.org |
PYC の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。PYC ファイルについて最初の質問をしてみましょう。
よくある質問
.pyc ファイルとは何ですか?削除しても大丈夫ですか?
.pyc を .py ソースに戻すにはどうすればよいですか?
decompyle3 や uncompyle6 を使用し(«decompyle3 file.pyc > file.py»)、Python 3.9 以降は pycdc を使用します。結果は近似的なもので、コメントや正確なフォーマットは失われます。また、最新の Python バージョンでは失敗することがあります。