Co to jest format pliku PYO?
Plik .pyo to przestarzały zoptymalizowany plik bajtkodu Python produkowany przez interpreter CPython po uruchomieniu z flagą -O (optymalizacja) lub -OO. Przekazanie -O usuwa instrukcje assert ze skompilowanego bajtkodu; przekazanie -OO dodatkowo usuwa wszystkie docstringi, nieznacznie zmniejszając rozmiar pliku.
Wewnętrznie pliki .pyo są identyczne pod względem formatu bajt po bajcie z plikami .pyc: posiadają 16-bajtowy nagłówek (4-bajtowy numer magiczny specyficzny dla wersji, 4-bajtowe pole flag, 4-bajtowy znacznik czasu lub skrót źródła, 4-bajtowy rozmiar źródła), po którym następuje zserializowany (marshalled) obiekt kodu CPython. Poziom optymalizacji jest odzwierciedlony tylko w skompilowanej zawartości - nigdy w nagłówku pliku.
Rozszerzenie .pyo zostało wycofane w Python 3.5 przez PEP 488 (wrzesień 2015) i nie jest już generowane przez żadne obecne wydanie Python. Od wersji Python 3.5 wzwyż zoptymalizowany bajtkod jest przechowywany wewnątrz __pycache__ pod nazwami takimi jak module.cpython-311.opt-1.pyc (dla -O) lub .opt-2.pyc (dla -OO). Jeśli napotkasz dziś plik .pyo, pochodzi on z kodu Python 2 lub Python 3.0-3.4.
Pliki .pyo nie są przenośne między wersjami CPython - numer magiczny zmienia się z każdym wydaniem. Narzędzia takie jak uncompyle6 (Python 2-3.8) i decompyle3 (Python 3.7-3.11) mogą dekompilować pliki .pyo z powrotem do przybliżonego kodu źródłowego .py, choć dokładność zależy od wersji Python i złożoności kodu.
Bezpieczeństwo
RYZYKO: MEDIUMPlik .pyo wykonuje się jako bajtkod Python ze wszystkimi możliwościami skryptu Python - dostępem do systemu plików, sieci, wykonywaniem podprocesów. Nigdy nie uruchamiaj pliku .pyo z niezaufanego źródła. Oprogramowanie antywirusowe często nie skanuje zawartości .pyo. Złośliwe aplikacje Python są czasem dystrybuowane wyłącznie jako bajtkod (.pyc/.pyo), aby utrudnić inżynierię wsteczną, choć dekompilatory mogą w dużej mierze odzyskać kod źródłowy.
Szczegóły formatu
w pigułceProgramy otwierające pliki PYO
Szczegóły techniczne
specyfikacja| Relacja formatów | Format pliku identyczny bajt po bajcie z `.pyc`; rozróżniany tylko przez rozszerzenie nazwy pliku i zawartość optymalizacji |
| Struktura nagłówka | 16-bajtowy nagłówek: 4-bajtowy numer magiczny wersji + 4-bajtowe flagi + 4-bajtowy mtime lub hash źródła + 4-bajtowy rozmiar źródła |
| Format treści | Zserializowany obiekt kodu CPython (instrukcje bajtkodu, pula stałych, nazwy, nazwy zmiennych, zagnieżdżone obiekty kodu) |
| Kolejność bajtów | Little-endian (format serializacji marshal CPython) |
| Poziom optymalizacji -O | Usuwa instrukcje `assert` ze skompilowanego bajtkodu |
| Poziom optymalizacji -OO | Usuwa instrukcje `assert` i wszystkie docstringi ze skompilowanego bajtkodu |
| Wycofanie | Rozszerzenie `.pyo` wyeliminowane w Python 3.5 (PEP 488, wrzesień 2015); niegenerowane przez żadne obecne wydanie Python |
| Współczesny odpowiednik | `module.cpython-3X.opt-1.pyc` (poziom 1) lub `.opt-2.pyc` (poziom 2) przechowywane w `__pycache__` |
| Przenośność wersji | Nieprzenośne między wersjami CPython; numer magiczny w bajtach 0-3 zmienia się z każdym głównym wydaniem CPython |
| Walidacja integralności | Python 3.7+ (PEP 552): opcjonalny SipHash źródła przechowywany w flagach nagłówka; Python 2 / wczesny 3: tylko porównanie mtime |
| Narzędzia do dekompilacji | `uncompyle6` (Python 2-3.8), `decompyle3` (Python 3.7-3.11) |
| Zakres dziedzictwa | Produkowane tylko przez Python 2 lub Python 3.0-3.4; niespotykane w projektach celujących w Python 3.5 lub nowszy |
| Wydano | Early CPython (1990s); same as .pyc but with optimizations (assert removal with -O; docstring removal with -OO) |
| Najnowsza wersja | 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 |
| Otwarty standard | Tak · bezpłatny (royalty-free) |
| Specyfikacja | peps.python.org |
Konwersje PYO
Pytania i odpowiedzi społeczności
pytania użytkownikówBrak pytań - bądź pierwszą osobą, która zapyta o pliki PYO.