Wenn ich ein Python-Deb-Paket installiere, sagen wir, python-numpy
die Dateien sind einfache Python-Dateien. Wie kann ich dem Paketmanager sagen, dass ich eigentlich lieber pyc oder noch besser pyo-Dateien verwenden würde?
quelle
Wenn ich ein Python-Deb-Paket installiere, sagen wir, python-numpy
die Dateien sind einfache Python-Dateien. Wie kann ich dem Paketmanager sagen, dass ich eigentlich lieber pyc oder noch besser pyo-Dateien verwenden würde?
Gut verpackte Python-Anwendungen werden .pyc
in einem Skript zu Dateien kompiliert, das nach der Installation der Dateien ausgeführt wird. Dies ist gemäß den Verpackungsrichtlinien erforderlich, um die derzeit verwendete Python-Installation übernehmen zu können. Denken Sie daran, dass .pyc
Dateien sehr systemspezifisch sind (Python-Version und Abhängigkeiten).
Alle .pyo
und .pyc
Dateien werden daher in Paketen ausdrücklich ausgeschlossen und von Lintian als Fehler gekennzeichnet :
Kompilierte Python-Quelldateien dürfen nicht im Paket enthalten sein. Diese Dateien sollten aus dem Paket entfernt und zur Paketinstallationszeit im Postinst erstellt werden.
Weitere Informationen finden Sie in Abschnitt 2.6 ( Modul-Byte-Kompilierung ) der Debian Python-Richtlinie .
Schweregrad: ernst, Gewissheit: sicher
Bei python-numpy
dieser Nachinstallation wird die Bytekompilierung vom Debhelper-Hook von pycentral übernommen. Nach der Installation sieht es so aus:
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
Der Grund, warum diese .pyc
/ .pyo
Dateien beim ersten Start der Anwendung nicht wie erwartet zur Laufzeit kompiliert werden, ist der folgende.
Die Python-Dateien werden in einem systemweiten Verzeichnis installiert, das allen Benutzern im System zur Verfügung steht. Immer wenn ein Benutzer die Anwendung startet, kann der Python-Interpreter die .py
Dateien lesen , aber nicht in die Verzeichnisse schreiben (z /usr/lib/python2.7/dist-packages/
. B. ). Dies ist Teil der allgemeinen Sicherheit in allen Linux-Systemen. Benutzer sollten nicht schreiben /usr
, nur mit Root-Rechten sollte dies möglich sein. Aus diesem Grund kompilieren die APT-Hooks die Python-Dateien zur Installationszeit für Sie. Erstens, um die Paketgröße zu minimieren, zweitens, um die Hooks erneut auslösen zu können, sobald sich auf Ihrem System Änderungen in Bezug auf Python ergeben, da eine Neukompilierung erforderlich ist, wenn sie beispielsweise bei Upgrades inkompatibel werden.
Dies wirkt sich jedoch nicht auf reguläre benutzereigene Python-Dateien aus, die zur Laufzeit kompiliert werden.
/usr/share/pyshared/
es mir selbst beschreibbar machen - damit Python beim ersten Ausführen Dateien kompilieren kann./usr/lib/python2.7/dist-packages/numpy
- gibt espyc
Dateien. Ich erinnere mich, dass ich dort nach sieben Installationen gesucht habe - und es gab einfach nur py-Dateien. Also kann ich den Fehler nicht reproduzieren..pyc
noch nicht da wäre, ist, dass das Paket nicht vollständig installiert wurde. Nach dem Auspacken sind weitere Schritte erforderlich. IIRC Der Python-Central-Hook wird erst ausgeführt, nachdem alle Pakete installiert wurden. In einer laufenden oder unterbrochenen APT-Sitzung, in der das Paket installiert wird, kann die von Ihnen beschriebene Beobachtung wahrscheinlich gemacht werden.