PYO ファイル形式とは?
.pyo ファイルは、CPython インタープリタを -O(最適化)または -OO フラグを付けて実行した際に生成される レガシーな Python 最適化済みバイトコード ファイルです。-O を渡すとコンパイル済みバイトコードから assert 文が取り除かれ、-OO を渡すとさらにすべての docstring(ドキュメント文字列)が削除され、ファイルサイズがわずかに削減されます。
内部的には、.pyo ファイルは .pyc ファイルと バイナリ形式においてバイト単位で同一 です。16バイトのヘッダー(4バイトのバージョン固有マジックナンバー、4バイトのフラグフィールド、4バイトのタイムスタンプまたはソースハッシュ、4バイトのソースサイズ)に続いて、マージル(marshal)された CPython コードオブジェクトが格納されています。最適化レベルはコンパイルされたコンテンツにのみ反映され、ファイルヘッダーには記録されません。
.pyo 拡張子は、PEP 488(2015年9月)により Python 3.5 で非推奨 となり、現在の Python リリースでは生成されなくなりました。Python 3.5 以降、最適化されたバイトコードは __pycache__ 内に module.cpython-311.opt-1.pyc(-O の場合)や .opt-2.pyc(-OO の場合)といった名前で保存されます。今日 .pyo ファイルに遭遇した場合、それは Python 2 または Python 3.0-3.4 のコードに由来するものです。
.pyo ファイルは CPython のバージョンをまたいで互換性がありません。マジックナンバーはリリースごとに変更されます。uncompyle6(Python 2-3.8対応)や decompyle3(Python 3.7-3.11対応)などのツールを使用すると、.pyo ファイルを元の .py ソースに近い形に逆コンパイルできますが、その精度は Python のバージョンやコードの複雑さによって異なります。
セキュリティと安全性
リスク: MEDIUM.pyo ファイルは、ファイルシステムへのアクセス、ネットワーク、サブプロセスの実行など、Python スクリプトのすべての機能を備えた Python バイトコードとして実行されます。信頼できないソースからの .pyo ファイルは決して実行しないでください。ウイルス対策ソフトウェアは .pyo の内容をスキャンしないことがよくあります。悪意のある Python アプリは、リバースエンジニアリングを困難にするためにバイトコードのみ(.pyc/.pyo)で配布されることがありますが、逆コンパイラによってソースの大部分を復元することが可能です。
形式の詳細
概要PYO ファイルを開くプログラム
技術的詳細
詳細仕様| フォーマットの関係性 | `.pyc` とバイト単位で同一のファイル形式。ファイル拡張子と最適化コンテンツによってのみ区別される |
| ヘッダー構造 | 16バイトのヘッダー:4バイトのバージョンマジック + 4バイトのフラグ + 4バイトのソース mtime またはハッシュ + 4バイトのソースサイズ |
| ボディ形式 | マージルされた CPython コードオブジェクト(バイトコード命令、定数プール、名前、変数名、ネストされたコードオブジェクト) |
| バイト順序 | リトルエンディアン(CPython marshal シリアル化形式) |
| 最適化レベル -O | コンパイル済みバイトコードから `assert` 文を削除する |
| 最適化レベル -OO | コンパイル済みバイトコードから `assert` 文とすべての docstring を削除する |
| 非推奨化 | `.pyo` 拡張子は Python 3.5 で廃止(PEP 488、2015年9月)。現在の Python リリースでは生成されない |
| 現代の代替手段 | `__pycache__` 内に保存される `module.cpython-3X.opt-1.pyc`(レベル1)または `.opt-2.pyc`(レベル2) |
| バージョンの移植性 | CPython バージョン間での移植性なし。0-3バイト目のマジックナンバーは CPython のメジャーリリースごとに変更される |
| 整合性検証 | Python 3.7+ (PEP 552): ヘッダーフラグに格納されたソースのオプションの SipHash。Python 2 / 初期の 3: mtime 比較のみ |
| 逆コンパイルツール | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| レガシーの範囲 | Python 2 または Python 3.0-3.4 でのみ生成。Python 3.5 以降を対象とするプロジェクトでは遭遇しない |
| リリース日 | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| 最新バージョン | DEPRECATED in Python 3.5 (PEP 488, September 2015) - .pyo extension no longer generated; replaced by .cpython-3X.opt-1.pyc / .opt-2.pyc naming |
| オープンスタンダード | はい · ロイヤリティフリー |
| 仕様書 | peps.python.org |
PYO の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。PYO ファイルについて最初の質問をしてみましょう。
よくある質問
.pyoファイルとは何ですか?
-O または -OO 最適化フラグを使用して作成された .py スクリプトのコンパイル済み形式です。バイナリ形式は .pyc と同一で、Python 2 および Python 3.0-3.4 で生成されていました。Python 3.5以降は .pyo ファイルを作成しません。.pyoファイルを開くにはどうすればよいですか?
decompyle3 や uncompyle6 を使用して .py ソースコードに逆コンパイルするか、拡張子を .pyc に変更してバイトコードディスアセンブラを使用します。.pyoファイルを削除しても大丈夫ですか?
.pyo ファイルはバイトコードキャッシュです。必要に応じて Python が再生成します。これらを削除しても、動作中の Python インストールやアプリが壊れることはありません(.py ソースファイルが存在する場合)。.pyoと.pycの違いは何ですか?
-O(assert削除)または -OO(docstringも削除)でコンパイルされたもので、.pyc は最適化なしでコンパイルされたものです。バイナリ形式は同一です。Python 3.5以降はこれらが統合され、.opt-1.pyc / .opt-2.pyc となりました。なぜPython 3.5以降は.pyoファイルを作成しないのですか?
.opt-1.pyc、.opt-2.pyc)にエンコードされます。.pyoを逆コンパイルしてPythonソースを取得するには?
decompyle3(Python 3.7-3.8)または uncompyle6(Python 2-3.8)を使用します: «pip install decompyle3 && decompyle3 file.pyo»。または、Webベースのオプションとして decompiler.com にアップロードします。特に docstring が欠落している -OO コンパイル済みファイルの場合、結果が不完全になる可能性があります。