2008-09-30 6 views

Antwort

262

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.

+1

Mindestens auf OS X 10.8 mit Python 2.7 hat die Umgebungsvariable keine Wirkung. – sorin

+2

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

+2

Ja, das funktioniert nie. – tar

1

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.

+0

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. –

1

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.

9

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“

22

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.

91
import sys 

sys.dont_write_bytecode = True 
+8

Dies funktioniert nicht für importierte Module –

+22

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. –

+0

Fügen Sie das im übergeordneten Modul hinzu, indem Sie das im referenzierten Skript hinzufügen. Das funktioniert cool. Danke an @te wilson – Sathy

2

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.

6

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 
0

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