Dlaczego py, a nie pyc czy pyo?

8

Kiedy instaluję pakiet deb Python, powiedzmy, że python-numpypliki są zwykłymi plikami Python. Jak powiedzieć menedżerowi pakietów - że wolałbym używać plików pyc lub nawet lepiej - plików pyo?

Cegła suszona na słońcu
źródło

Odpowiedzi:

12

Już je masz i już ich używasz

Dobrze spakowane aplikacje Pythona są kompilowane do .pycplików w skrypcie uruchamianym po instalacji plików. Jest to potrzebne zgodnie z wytycznymi dotyczącymi pakowania, aby móc dostosować się do instalacji Pythona, której używasz w tym momencie. Pamiętaj, że .pycpliki są bardzo specyficzne dla twojego systemu (wersja i zależności Pythona).

Dlatego wszystkie pliki .pyoi .pycsą specjalnie wykluczone w pakietach i oznaczone przez Lintian jako błędy :

Skompilowane pliki źródłowe Pythona nie mogą być zawarte w pakiecie. Pliki te należy usunąć z pakietu i utworzyć podczas instalacji pakietu w postinst.

Szczegółowe informacje znajdują się w Polityce Python w dziale 2.6 ( Kompilacja bajtów modułów ).

Istotność: poważna, Pewność: pewna

W przypadku python-numpytej poinstalacyjnej kompilacji bajtów jest obsługiwany przez hak debhelper pycentral. Po instalacji wygląda to tak:

ls -l /usr/lib/python2.7/dist-packages/numpy
lrwxrwxrwx  1 root root     47 Mar 20  2012 add_newdocs.py -> ../../../../share/pyshared/numpy/add_newdocs.py
-rw-r--r--  1 root root 251912 Aug  6 22:06 add_newdocs.pyc

Więcej informacji w tle

Powód, dla którego te .pyc/ .pyopliki nie są kompilowane w czasie wykonywania podczas pierwszego uruchomienia aplikacji, zgodnie z oczekiwaniami, jest następujący.

Pliki Python są instalowane w ogólnosystemowym katalogu, dostępnym dla wszystkich użytkowników w systemie. Za każdym razem, gdy użytkownik uruchamia aplikację, interpreter Pythona może czytać .pypliki, ale nie może zapisywać do katalogów (np /usr/lib/python2.7/dist-packages/.). Jest to część ogólnego bezpieczeństwa we wszystkich systemach Linux; użytkownicy nie powinni pisać /usr, tylko z prawami roota powinno to być możliwe. Z tego powodu punkty zaczepienia APT skompilują dla Ciebie pliki Python podczas instalacji; po pierwsze, aby zminimalizować rozmiar pakietu, po drugie, aby móc ponownie uruchomić haki, gdy coś zmieni się w twoim systemie w odniesieniu do Pythona, ponieważ wymagana jest ponowna kompilacja, gdy na przykład nie będą kompatybilne podczas aktualizacji.

Nie wpłynie to jednak na kompilację zwykłych plików Pythona tworzonych przez użytkownika w czasie wykonywania.

gertvdijk
źródło
Powinienem więc /usr/share/pyshared/napisać do siebie - aby umożliwić Pythonowi kompilowanie plików przy pierwszym uruchomieniu.
Adobe
4
@Adobe Co? Nie! Nigdy nie należy zapisywać tych katalogów systemowych dla użytkowników. Twoje zarządzanie pakietami już je skompilowało (zgodnie z tym, co próbowałem powiedzieć w mojej odpowiedzi). Teraz zaktualizowane, aby było bardziej jasne o tym.
gertvdijk
Ty teraz - na który właśnie patrzę /usr/lib/python2.7/dist-packages/numpy- są pycpliki. Pamiętam, że szukałem tam na kilku instalacjach - i były tam tylko zwykłe pliki py. Więc trochę „nie mogę odtworzyć błędu”.
Adobe
Jedynym powodem, dla którego .pycjeszcze go nie ma, jest to, że pakiet nie został całkowicie zainstalowany. Po rozpakowaniu należy podjąć inne kroki. IIRC hak centralny Pythona jest uruchamiany dopiero po zainstalowaniu wszystkich pakietów. Tak więc podczas trwającej lub przerywanej sesji APT instalującej pakiet prawdopodobnie można dokonać opisanej obserwacji.
gertvdijk