Co to jest format pliku PYC?
Pliki .pyc są używane przez język programowania Python. Plik .pyc to plik wykonywalny zawierający skompilowany kod bajtowy programu napisanego w źródle Python. Kod bajtowy to zestaw instrukcji dla interpretera, umożliwiający uruchomienie programu bez ponownego analizowania oryginalnego źródła przy każdym uruchomieniu, co przyspiesza czas importu i startu.
Plikom .pyc towarzyszą powiązane pliki źródłowe .py. Python kompiluje plik .py i zapisuje wynik w pliku .pyc, który może być następnie użyty do bezpośredniego uruchomienia programu. Od wersji Python 3.2 te pliki pamięci podręcznej są umieszczane w podkatalogu __pycache__ obok źródła, z wersją interpretera osadzoną w nazwie pliku (na przykład script.cpython-312.pyc).
Każdy plik .pyc zaczyna się od 16-bajtowego nagłówka. Pierwsze dwa bajty to specyficzna dla wersji „magic number” - zmienia się ona przy każdym wydaniu CPython - po której następują bajty 0x0D 0x0A (CR LF) na pozycjach 2-3. Pozostałe bajty nagłówka przechowują znacznik czasu i rozmiar pliku źródłowego (domyślnie) lub skrót (hash) pliku źródłowego dla deterministycznych, powtarzalnych kompilacji, co wprowadzono w PEP 552 w Python 3.7. Po nagłówku plik zawiera zserializowany (marshalled) obiekt kodu, który można sprawdzić za pomocą wbudowanego modułu dis języka Python.
Kod bajtowy .pyc jest powiązany z konkretną wersją CPython - plik skompilowany w Python 3.11 nie zostanie załadowany w Python 3.12. Starszy format zoptymalizowanego kodu bajtowego .pyo został usunięty w Python 3.5; zoptymalizowane kompilacje tworzą teraz zamiast tego pliki .opt-1.pyc lub .opt-2.pyc. Aby zdekompilować .pyc z powrotem do czytelnego źródła, powszechnie używa się narzędzi takich jak uncompyle6, decompyle3 i pycdc (Decompyle++), choć kompatybilność zależy od wersji Python. W systemie Windows skompilowane moduły rozszerzeń używają powiązanego formatu .pyd.
Bezpieczeństwo
RYZYKO: MEDIUMPlik .pyc to kod bajtowy, który interpreter Python WYKONUJE, więc złośliwy .pyc może uruchomić dowolny kod, tak jak skrypt - nigdy nie uruchamiaj .pyc z niezaufanego źródła. Jest to również powszechna technika ukrywania złośliwego oprogramowania (dostarczanie tylko skompilowanego kodu bajtowego). Z drugiej strony, dystrybucja własnego kodu jako .pyc daje bardzo słabą ochronę: można go zdekompilować i przynajmniej rozmontować za pomocą dołączonego modułu „dis”, więc NIE jest to prawdziwy sposób na zachowanie tajemnicy źródła. Usuwanie plików __pycache__ / .pyc jest bezpieczne - Python regeneruje je automatycznie ze źródeł .py.
Szczegóły formatu
w pigułceProgramy otwierające pliki PYC
Szczegóły techniczne
specyfikacja| Deweloper | Python Software Foundation (CPython) |
| Typ MIME | application/x-python-code |
| Struktura pliku | Binarna - 16-bajtowy nagłówek z wersją, po którym następuje zserializowany obiekt kodu Python |
| Magic number | Bajty 0-1: 2-bajtowa wartość specyficzna dla wersji (różna dla każdego wydania CPython); bajty 2-3: zawsze 0x0D 0x0A (CR LF) |
| Układ nagłówka | 32-bitowy magic, 32-bitowe flagi pól bitowych, następnie 32-bitowy mtime + 32-bitowy rozmiar źródła (tryb znacznika czasu) lub 32-bitowy hash źródła (tryb skrótu PEP 552) |
| Katalog pamięci podręcznej | Przechowywany w __pycache__/ od Python 3.2; nazwa pliku koduje wersję interpretera, np. script.cpython-312.pyc |
| Kompatybilność wersji | Każda wersja CPython zapisuje unikalny magic number; plik .pyc z Python 3.11 nie załaduje się w 3.12 i odwrotnie |
| Przenośność platformy | Niezależny od platformy w ramach tej samej wersji CPython - ten sam .pyc działa na Windows, macOS i Linux z pasującym interpreterem |
| Warianty zoptymalizowane | python -O i python -OO tworzą pliki .opt-1.pyc i .opt-2.pyc (usuwają asercje i docstringi); rozszerzenie .pyo zostało wycofane w Python 3.5 |
| Kontrola automatycznego generowania | CPython zapisuje pliki .pyc automatycznie przy imporcie; można to zablokować flagą -B lub zmienną środowiskową PYTHONDONTWRITEBYTECODE=1 |
| Disassembly / dekompilacja | Wbudowany moduł dis języka Python rozmontowuje kod bajtowy; narzędzia zewnętrzne uncompyle6, decompyle3 i pycdc (Decompyle++) próbują zrekonstruować źródło |
| Wewnętrzny format serializacji | Obiekty kodu są serializowane za pomocą modułu marshal - kompaktowego formatu binarnego odrębnego od pickle, niebędącego częścią stabilnego publicznego API |
| Kompilacje oparte na skrótach (hash) | PEP 552 (Python 3.7+) wprowadził pliki .pyc oparte na skrótach: nagłówek przechowuje hash pliku źródłowego zamiast mtime dla powtarzalnych kompilacji |
| Wydano | Early CPython (1990s); current header layout (PEP 552 hash-based, deterministic) since Python 3.7, 2018 |
| Otwarty standard | Tak · bezpłatny (royalty-free) |
| Specyfikacja | docs.python.org |
Konwersje PYC
Pytania i odpowiedzi społeczności
pytania użytkownikówBrak pytań - bądź pierwszą osobą, która zapyta o pliki PYC.