web-dev-qa-db-de.com

Wie vermeide ich .pyc-Dateien?

Kann ich den Python-Interpreter ausführen, ohne die kompilierten .pyc-Dateien zu generieren?

252
Avner

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 .

280
Constantin
import sys

sys.dont_write_bytecode = True
100
te wilson

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.

22
Jason Baker

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.

11
Brian

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
6
Elwyne

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. 

3
Ravil Asadov

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.

1
Logan

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
0
alpha_989

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.

0
Alex

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.

0
Rotareti