Kann ich den Python-Interpreter ausführen, ohne die kompilierten .pyc-Dateien zu generieren?
Von "Neuerungen in Python 2.6 - Änderungen der Interpretation" :
Python kann jetzt von .__ abgehalten werden. Schreiben von .pyc- oder .pyo-Dateien mit Versorgen des Python mit dem Schalter -B Interpreter oder durch die Einstellung von PYTHONDONTWRITEBYTECODE environment Variable vor dem Ausführen von Dolmetscher. Diese Einstellung ist verfügbar zu Python-Programmen als
sys.dont_write_bytecode
Variable und Python-Code kann den Wert in .__ ändern. das Verhalten des Interpreters ändern.
Update 2010-11-27: Python 3.2 behebt das Problem störender Quellordner mit .pyc
-Dateien, indem ein spezieller __pycache__
-Unterordner eingeführt wird. Siehe Neuerungen in Python 3.2 - PYC-Repository-Verzeichnisse .
import sys
sys.dont_write_bytecode = True
Es gibt tatsächlich IS eine Möglichkeit, dies in Python 2.3+ zu tun, aber es ist etwas esoterisch. Ich weiß nicht, ob Sie das erkennen, aber Sie können Folgendes tun:
$ unzip -l /tmp/example.Zip
Archive: /tmp/example.Zip
Length Date Time Name
-------- ---- ---- ----
8467 11-26-02 22:30 jwzthreading.py
-------- -------
8467 1 file
$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32)
>>> import sys
>>> sys.path.insert(0, '/tmp/example.Zip') # Add .Zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.Zip/jwzthreading.py'
Entsprechend der zipimport library:
Alle Dateien können im Zip-Archiv vorhanden sein, aber nur die Dateien .py und .py [co] sind für den Import verfügbar. Der Import von dynamischen Modulen (.pyd, .so) ist nicht zulässig. Wenn ein Archiv nur .py-Dateien enthält, versucht Python nicht, das Archiv durch Hinzufügen der entsprechenden .pyc- oder .pyo-Datei zu ändern. Wenn ein Zip-Archiv keine .pyc-Dateien enthält, ist der Import möglicherweise sehr langsam.
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 auch das Skript mit diesem Rezept packen: unix Zip-Programmdatei . Beachten Sie jedoch, dass Sie dies möglicherweise anpassen müssen, wenn Sie stdin verwenden oder etwas von sys.args lesen möchten (Es kann ohne allzu große Mühe gemacht werden).
Meiner Erfahrung nach leidet die Leistung nicht allzu sehr, aber Sie sollten dies zweimal überlegen, bevor Sie sehr große Module auf diese Weise importieren.
In 2.5 gibt es keine Möglichkeit, dies zu unterdrücken, außer Maßnahmen, die den Benutzern keinen Schreibzugriff auf das Verzeichnis gewähren.
In Python 2.6 und 3.0 kann es jedoch im sys-Modul eine Einstellung mit dem Namen "dont_write_bytecode" geben, mit der dies unterdrückt werden kann. Dies kann auch durch Übergeben der Option "-B" oder Einstellen der Umgebungsvariable "PYTHONDONTWRITEBYTECODE" eingestellt werden.
Sie können sys.dont_write_bytecode = True
in Ihrer Quelle festlegen, dies müsste jedoch in der ersten geladenen Python-Datei sein. Wenn Sie python somefile.py
ausführen, wird somefile.pyc
nicht angezeigt.
Wenn Sie ein Dienstprogramm mit setup.py
und entry_points=
installieren, haben Sie sys.dont_write_bytecode
im Startskript festgelegt. Sie können sich also nicht auf das von setuptools generierte "standardmäßige" Startskript verlassen.
Wenn Sie Python mit der Python-Datei als Argument selbst starten, können Sie -B
angeben:
python -B somefile.py
somefile.pyc
würde sowieso nicht generiert, aber auch keine .pyc
-Dateien für andere importierte Dateien.
Wenn Sie über ein Dienstprogramm myutil
verfügen, das Sie nicht ändern können, wird -B nicht an den Python-Interpreter übergeben. Starten Sie es einfach, indem Sie die Umgebungsvariable PYTHONDONTWRITEBYTECODE
setzen:
PYTHONDONTWRITEBYTECODE=x myutil
Ich habe mehrere Testfälle in einer Testsuite und bevor ich die Testsuite im Mac-Terminal ausgeführt habe:
python LoginSuite.py
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 gelöst:
python -B LoginSuite.py
Diese Methode funktioniert, wenn Sie Testfälle in die Testsuite importieren und die Suite in der Befehlszeile ausführen.
Sie können die Verzeichnisse, in denen Ihre Module vorhanden sind, schreibgeschützt für den Benutzer erstellen, unter dem der Python-Interpreter ausgeführt wird.
Ich glaube nicht, dass es eine elegantere Option gibt. PEP 304 scheint ein Versuch gewesen zu sein, eine einfache Option dafür einzuführen, aber es wurde anscheinend aufgegeben.
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.
Lösung für ipython 6.2.1 using python 3.5.2
(getestet unter Ubuntu 16.04 und Windows 10):
Ipython
respektiert %env PYTHONDONTWRITEBYTECODE =1
nicht, wenn sie im ipython
-Interpretor oder während des Startvorgangs in ~/.ipython/profile-default/startup/00-startup.ipy
..__ eingestellt ist. Verwenden Sie stattdessen Folgendes in Ihrem ~.ipython/profile-default/startup/00-startup.py
import sys
Sys.dont_write_bytecode=True
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 werden jedoch alle vom Skript importierten Module kompiliert).
Die eigentliche Frage ist, warum Sie nicht möchten, dass Python die Module kompiliert? Sie könnten wahrscheinlich eine Möglichkeit automatisieren, diese aufzuräumen, wenn sie im Weg sind.
Beginnend mit Python 3.8 können Sie die Umgebungsvariable PYTHONPYCACHEPREFIX
verwenden, um ein Cache-Verzeichnis für Python zu definieren.
Aus den Python Dokumenten:
Wenn dies festgelegt ist, schreibt Python .pyc-Dateien in eine gespiegelte Verzeichnisstruktur unter diesem Pfad anstatt in pycache -Verzeichnisse innerhalb der Quellstruktur. Dies entspricht der Angabe der Option -X pycache_prefix = PATH.
Beispiel
Wenn Sie Ihrem ./profile
unter Linux die folgende Zeile hinzufügen:
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Python erstellt nicht die lästigen Verzeichnisse __pycache__
in Ihrem Projektverzeichnis, sondern legt sie alle unter ~/.cache/cpython/
ab.