Kann ich den Python-Interpreter ausführen, ohne die kompilierten .pyc-Dateien zu generieren?
268
Aus "Was ist neu in Python 2.6 - Interpreter-Änderungen" :
Python kann jetzt daran gehindert werden, .pyc- oder .pyo-Dateien zu schreiben, indem der Python-Interpreter mit dem Schalter -B versehen wird oder indem die Umgebungsvariable PYTHONDONTWRITEBYTECODE festgelegt wird, bevor der Interpreter ausgeführt wird. Diese Einstellung steht Python-Programmen als
sys.dont_write_bytecode
Variable zur Verfügung, und Python-Code kann den Wert ändern, um das Verhalten des Interpreters zu ändern.
Update 27.11.2010: Python 3.2 behebt das Problem, dass Quellordner mit .pyc
Dateien überfüllt sind, indem ein spezieller __pycache__
Unterordner eingeführt wird (siehe Neue Funktionen in Python 3.2 - PYC-Repository-Verzeichnisse) .
export PYTHONDONTWRITEBYTECODE=1
quelle
site-packages/usercustomize.py
, damit dies auf alle Ihre Skripte angewendet wird. Für mich war dieses Verzeichnis$HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
. Vgl. docs.python.org/2/tutorial/…import sys; sys.dont_write_bytecode = True
In Python 2.3+ gibt es tatsächlich eine Möglichkeit, dies zu tun, aber es ist ein bisschen esoterisch. Ich weiß nicht, ob Sie das erkennen, aber Sie können Folgendes tun:
Laut der Zipimport- Bibliothek:
Alles, was Sie tun müssen, ist, die Dateien zu komprimieren, die Zip-Datei zu Ihrem sys.path hinzuzufügen und sie dann zu importieren.
Wenn Sie dies für UNIX erstellen, können Sie Ihr Skript auch nach folgendem Rezept packen : Unix zip ausführbar . Beachten Sie jedoch, dass Sie dies möglicherweise anpassen müssen, wenn Sie stdin verwenden oder etwas aus sys.args lesen möchten (es KANN sein) ohne zu viel Mühe gemacht).
Nach meiner Erfahrung leidet die Leistung nicht allzu sehr darunter, aber Sie sollten zweimal überlegen, bevor Sie sehr große Module auf diese Weise importieren.
quelle
In 2.5 gibt es keine Möglichkeit, dies zu unterdrücken, außer Maßnahmen, wie Benutzern keinen Schreibzugriff auf das Verzeichnis zu gewähren.
In Python 2.6 und 3.0 gibt es jedoch möglicherweise eine Einstellung im sys-Modul namens "dont_write_bytecode", die festgelegt werden kann, um dies zu unterdrücken. Dies kann auch durch Übergeben der Option "-B" oder durch Setzen der Umgebungsvariablen "PYTHONDONTWRITEBYTECODE" festgelegt werden.
quelle
Sie können
sys.dont_write_bytecode = True
in Ihrer Quelle festlegen , aber das müsste in der ersten geladenen Python-Datei sein. Wenn Sie ausführen, erhaltenpython somefile.py
Sie nichtsomefile.pyc
.Wenn Sie ein Dienstprogramm mit installieren
setup.py
und habenentry_points=
Siesys.dont_write_bytecode
im Startskript festgelegt. Sie können sich also nicht auf das von setuptools generierte "Standard" -Start-Skript verlassen.Wenn Sie Python selbst mit einer Python-Datei als Argument starten, können Sie Folgendes angeben
-B
:somefile.pyc
würde sowieso nicht generiert, aber keine.pyc
Dateien für andere Dateien auch importiert.Wenn Sie ein Dienstprogramm haben
myutil
und dieses nicht ändern können, wird -B nicht an den Python-Interpreter übergeben. Starten Sie es einfach, indem Sie die Umgebungsvariable festlegenPYTHONDONTWRITEBYTECODE
:quelle
Ich habe mehrere Testfälle in einer Testsuite und bevor ich die Testsuite im Mac Terminal wie folgt ausgeführt habe:
Wenn Sie den Befehl auf diese Weise ausführen, wurde mein Verzeichnis mit .pyc-Dateien gefüllt. Ich habe die unten angegebene Methode ausprobiert und das Problem behoben:
Diese Methode funktioniert, wenn Sie Testfälle in die Testsuite importieren und die Suite in der Befehlszeile ausführen.
quelle
Ab Python 3.8 können Sie mit der Umgebungsvariablen
PYTHONPYCACHEPREFIX
ein Cache-Verzeichnis für Python definieren.Aus den Python-Dokumenten:
Beispiel
Wenn Sie Ihrem
./profile
Linux die folgende Zeile hinzufügen :Python erstellt nicht die nervigen
__pycache__
Verzeichnisse in Ihrem Projektverzeichnis, sondern legt sie alle ab~/.cache/cpython/
quelle
Sie können die Verzeichnisse, in denen Ihre Module vorhanden sind, für den Benutzer, unter dem der Python-Interpreter ausgeführt wird, schreibgeschützt machen.
Ich denke nicht, dass es eine elegantere Option gibt. PEP 304 scheint ein Versuch gewesen zu sein, eine einfache Option dafür einzuführen, aber es scheint aufgegeben worden zu sein.
Ich kann mir vorstellen, dass es wahrscheinlich ein anderes Problem gibt, das Sie lösen möchten. Das Deaktivieren von .py [co] scheint eine Problemumgehung zu sein, aber es ist wahrscheinlich besser, stattdessen das ursprüngliche Problem anzugreifen.
quelle
Lösung für
ipython 6.2.1 using python 3.5.2
(Getestet unter Ubuntu 16.04 und Windows 10):Ipython
wird nicht berücksichtigt,%env PYTHONDONTWRITEBYTECODE =1
wenn imipython
Interpretor oder beim Start in eingestellt~/.ipython/profile-default/startup/00-startup.ipy
. Verwenden Sie stattdessen Folgendes in Ihrem~.ipython/profile-default/startup/00-startup.py
quelle
Soweit ich weiß, kompiliert Python alle Module, die Sie "importieren". Python kompiliert jedoch KEIN Python-Skript, das mit "python script.py" ausgeführt wird (es kompiliert jedoch alle Module, die das Skript importiert).
Die eigentliche Frage ist, warum Python die Module nicht kompilieren soll. Sie könnten wahrscheinlich einen Weg automatisieren, diese zu bereinigen, wenn sie im Weg sind.
quelle
.pyc
Dateien gibt. Wenn ich die Klasse / das Modul ändere, wird die.pyc
Datei aus irgendeinem Grund nicht aktualisiert. Wenn ich es nach dem Ändern der.py
Datei importiere , wird es weiterhin verwendet.pyc
, was zu Fehlern führt