Kann ich den Python-Interpreter ausführen, ohne die kompilierten .pyc-Dateien zu generieren?Wie zu vermeiden. Pyc-Dateien?
Antwort
Von "What’s New in Python 2.6 - Interpreter Changes" eingestellt werden:
Python kann nun von Schreiben .pyc oder .pyo Dateien dadurch verhindert werden, Zuführen des -B Schalter auf die Python Interpreter oder durch die PYTHONDONTWRITEBYTECODE Umgebung variable Einstellung vor dem Interpreter ausgeführt wird. Diese Einstellung ist für Python-Programme als
sys.dont_write_bytecode
Variable verfügbar, und Python-Code kann den Wert in ändern das Verhalten des Interpreters ändern.
-Update 2010-11-27: Python 3.2 Adressen die Frage der Quellordner mit .pyc
Dateien unübersichtlich durch einen speziellen __pycache__
Unterordner Einführung finden What's New in Python 3.2 - PYC Repository Directories.
Soweit ich weiß, kompiliert Python alle Module, die Sie "importieren". Python kompiliert jedoch kein Python-Skript mit: "python script.py" (es kompiliert jedoch alle Module, die das Skript importiert).
Die wirkliche Frage ist, warum Python nicht die Module kompilieren soll? Sie könnten wahrscheinlich eine Art der Reinigung automatisieren, wenn sie in die Quere kommen.
ich gefunden habe häufig, dass es abgestanden Bytecode '.pyc' Dateien. Aus irgendeinem Grund, wenn ich die Klasse/das Modul ändere, wird die '.pyc' Datei nicht aktualisiert. Wenn ich es nach der Änderung der '.py' Datei importiere, wird es immer noch die' .pyc' Datei benutzen, was zu Fehlern führt. –
Sie könnten die Verzeichnisse, in denen Ihre Module vorhanden sind, für den Benutzer, für den der Python-Interpreter ausgeführt wird, als schreibgeschützt festlegen.
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 scheint aufgegeben worden zu sein.
Ich denke, es gibt wahrscheinlich ein anderes Problem, das Sie versuchen zu lösen, für das Deaktivieren von .py [co] scheint eine Umgehung zu sein, aber es wird wahrscheinlich besser sein, anzugreifen, was auch immer dieses ursprüngliche Problem ist.
In 2.5 gibt es keine Möglichkeit, es zu unterdrücken, außer Maßnahmen, die Benutzern keinen Schreibzugriff auf das Verzeichnis geben.
In Python 2.6 und 3.0 kann jedoch eine Einstellung im sys-Modul namens "dont_write_bytecode" eingestellt werden, um dies zu unterdrücken. Dies kann auch, indem man die Option „-b“ oder die Einstellung der Umgebungsvariable „PYTHONDONTWRITEBYTECODE“
Es gibt tatsächlich eine Möglichkeit, es in Python 2.3 + zu tun, aber es ist ein bisschen esoterisch. Ich weiß nicht, ob Sie dies zu realisieren, 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'
Nach der zipimport Bibliothek:
Alle Dateien im ZIP-Archiv vorhanden sein können, aber nur Dateien. py und .py [co] stehen für den Import zur Verfügung. ZIP-Import von dynamischen Modulen (.pyd, .so) ist nicht erlaubt. Beachten Sie, dass Python nicht versucht, das Archiv durch Hinzufügen der entsprechenden .pyc- oder .pyo-Datei zu modifizieren, wenn ein Archiv nur .py-Dateien enthält. Das heißt, wenn ein ZIP-Archiv keine .pyc-Dateien enthält, kann der Import ziemlich langsam sein.
Also, alles, was Sie tun müssen, ist die Dateien zip, fügen Sie die ZIP-Datei zu Ihrem sys.path und importieren Sie sie dann.
Wenn Sie dies für UNIX erstellen, sollten Sie auch Ihr Skript mit diesem Rezept packen: unix zip executable, aber beachten Sie, dass Sie dies eventuell anpassen müssen, wenn Sie stdin verwenden oder irgendetwas von sys.args (it Kann ohne zu viel Mühe gemacht werden).
In meiner Erfahrung leidet die Leistung nicht zu sehr, aber Sie sollten zweimal darüber nachdenken, bevor Sie sehr große Module auf diese Weise importieren.
import sys
sys.dont_write_bytecode = True
Dies funktioniert nicht für importierte Module –
Ich habe es gerade versucht und es funktioniert für importierte Module. Wenn diese Variable einmal gesetzt ist, werden später importierte Dateien keine pyc-Dateien erzeugen. Das ist wunderbar. Vielen Dank. –
Fügen Sie das im übergeordneten Modul hinzu, indem Sie das im referenzierten Skript hinzufügen. Das funktioniert cool. Danke an @te wilson – Sathy
Ich habe mehrere Testfälle in Testsuite und bevor ich die Testsuite in der Mac-Terminal wie folgt ausgeführt werden:
python LoginSuite.py
Ausführen des Befehls auf diese Weise mein Verzeichnis wurde bevölkerten mit .pyc-Dateien. Ich versuchte, die unten angegebene Methode, und es löste das Problem:
python -B LoginSuite.py
Diese Methode funktioniert, wenn Sie Testfälle in die Testsuite importieren und die Suite auf der Kommandozeile ausgeführt wird.
Sie können sys.dont_write_bytecode = True
in Ihrer Quelle festlegen, aber das müsste in der ersten Python-Datei geladen werden. Wenn Sie python somefile.py
ausführen, erhalten Sie nicht somefile.pyc
.
Wenn Sie ein Dienstprogramm installieren setup.py
und entry_points=
nutzen, erhalten Sie sys.dont_write_bytecode
im Startskript gesetzt. Sie können sich also nicht auf das Startskript "default" von setuptools verlassen.
Wenn Sie sich Python mit Python-Datei als Argument starten, können Sie -B
angeben:
python -B somefile.py
somefile.pyc
würde ohnehin nicht erzeugt werden, aber keine .pyc
Dateien für andere Dateien zu importieren.
Wenn Sie ein Dienstprogramm myutil
haben und Sie das nicht ändern können, wird es nicht B an den Python-Interpreter übergeben. Starten Sie es einfach durch die Umgebungsvariable PYTHONDONTWRITEBYTECODE
:
PYTHONDONTWRITEBYTECODE=x myutil
Lösung für ipython 6.2.1 using python 3.5.2
(getestet auf Ubuntu 16.04 und Windows 10):
Ipython
nicht %env PYTHONDONTWRITEBYTECODE =1
im ipython
interpretor oder während des Starts, wenn festgelegt nicht respektiert in ~/.ipython/profile-default/startup/00-startup.ipy
. Anstatt für die folgenden in Ihrem ~.ipython/profile-default/startup/00-startup.py
import sys
Sys.dont_write_bytecode=True
Mindestens auf OS X 10.8 mit Python 2.7 hat die Umgebungsvariable keine Wirkung. – sorin
Wenn Sie den Interpreter (in einem C++ - Programm) einbetten, verwenden Sie "Py_DontWriteBytecodeFlag = 1;" in deinem Quellcode.Das ist ein globaler Int, der in pydebug.h deklariert ist. – JimB
Ja, das funktioniert nie. – tar