2012-07-13 4 views
9

Ich untersuche die Kompilierung einer recht großen Menge von Python-Modulen und -Paketen zu pyo. Ich weiß, dass dies möglich ist, indem Sie entweder die Umgebungsvariable PYTHONOPTIMIZE setzen oder -O beim Start angeben. Ich möchte Pyo anstelle von Pyc erzwingen, um den kleinstmöglichen Platzbedarf zu erzielen. Um dies in meinem Bereitstellungsmodul zu tun, muss ich ein Wrapper-Skript erstellen, das das eigentliche Skript mit der Option -O startet, weil die Umgebungsvariable vor dem Starten des Interpreters angegeben werden muss.Kompilieren von .py-Dateien zu .pyo, ohne auf ein Wrapper-Skript zurückzugreifen

Gibt es eine Möglichkeit, dies zu umgehen und Pyo-Erstellung programmgesteuert erzwingen?

Mit freundlichen Grüßen, Thorsten

Antwort

17

Um kompilieren alle Module im Voraus, den folgenden Befehl ausführen:

python -O -m compileall /path/to/your/files 

Die python compileall module Pflege der Zusammenstellung in Anspruch nimmt, -O switch macht es Ausgabe .pyo Dateien.

Sie können jedoch nicht Python zwingen, diese zu verwenden, es sei denn der -O Schalter für jeden Lauf gegeben oder die PYTHONOPTIMIZE environment var gesetzt.

Beachten Sie, dass die Option -O die assert-Anweisung deaktiviert und das __debug__-Flag auf False setzt (und Python wird die Tests optimieren). Geben Sie -OO und Docstrings an. Diese sorgen nicht für eine große Geschwindigkeitsdifferenz oder Platzersparnis, es sei denn, Sie verwenden exzessive Docstring-Größen oder sehr langsamen Debug-Code.

Siehe: What does Python optimization (-O or PYTHONOPTIMIZE) do?

+0

Danke für die Antwort, aber wie oben i des Schalters kennen skizzierte und würde es gerne vermeiden. Der Grund ist, dass es sich um ein Deployment-Tool handelt, und ich möchte verhindern, dass versehentlich zwei verschiedene Versionen (pyc und pyo) derselben Datei bereitgestellt werden. Momentan mache ich das, indem ich einen python.exe -O-Aufruf in ein Python-Skript über os.system einpacke. Das funktioniert, ist aber etwas merkwürdig, also fragte ich mich, ob ich das loswerden könnte. –

+0

Wäre schön, in der Lage zu sein, es programmgesteuert (einfacher) zu steuern ... – martineau

+0

"Beachten Sie, dass alle -O-Flag die Anweisung assert deaktiviert. Geben Sie -OO und Docstrings fallen gelassen. Diese machen nicht viel Geschwindigkeitsunterschied oder Platzeinsparungen. " <- Das hängt wirklich davon ab, wie viele 'assert' und 'if __debug__' Statements Sie haben, nicht wahr? Sie wissen, was sie über Annahmen sagen. – DylanYoung

Verwandte Themen