2009-07-07 11 views
5

Ich habe mit pyglet gespielt. Es ist sehr nett. wenn ich meinen Code jedoch ausgeführt, die in einer ausführbaren Datei ist (nennen wir es game.py) mit dem Präfix der üblichenProgrammatische Steuerung der Python-Optimierung?

#!/usr/bin/env python 

von

./game.py 

tun, dann ist es ein bisschen klobig. Aber wenn ich es laufen mit

python -O ./game.py 

oder

PYTHONOPTIMIZE=1 ./game.py 

dann seine super-glatt.

Mir ist egal, warum es langsam ohne Optimierung läuft; pyglets Dokumentation erwähnt, dass die Optimierung zahlreiche Asserts und auch OpenGLs Fehlerüberprüfung deaktiviert, und ich bin froh, dass ich es dabei belassen werde.

Meine Frage ist: Wie stellen Leute, die Python-Code verteilen, sicher, dass die Endbenutzer (ohne Interesse am Debuggen oder Ändern des Codes) die optimierte Version des Codes ausführen. Sicherlich gibt es einen besseren Weg, als den Leuten zu sagen, dass sie Optimierungen in den Versionshinweisen verwenden (die sie wahrscheinlich sowieso nicht lesen werden).

Unter Linux kann ich ein Skript ./game bieten einfach die Datei für Endbenutzer auszuführen:

#!/bin/sh 
PYTHONOPTIMIZE=1 ./game.py $* 

aber das ist nicht sehr Cross-Plattform.

Ich habe eine Idee, ich sollte die #! Linie

#!/usr/bin/env PYTHONOPTIMIZE=1 python 

oder

#!/usr/bin/env python -O 

aber die ändern können, scheinen nicht wie erwartet zu funktionieren, und ich bin nicht sicher, was sie unter Windows machen würden.

Gibt es eine Möglichkeit, die Optimierung aus dem Code zu steuern, von dem ich nichts weiß? Etwas wie:

import runtime 
    runtime.optimize(True) 

Was von Menschen in diesem Bereich Best-Practice betrachtet hat Code Python Multi-Plattform-Versand?

+2

Dies ist keine Antwort, da S.Lotts Antwort vollständig korrekt und erschöpfend war. Gehen Sie mit game.sh und game.bat, es funktioniert. Aber nur ein Kommentar: Die #! Zeile macht absolut nichts auf Windows, es wird komplett ignoriert. –

Antwort

14

„Auf Linux ich leicht einen ./game Skript zur Verfügung stellen kann, die Datei für Endbenutzer ausführen:“

Richtig.

"aber das ist nicht sehr plattformübergreifend."

Halb korrekt. Es gibt genau zwei Shell-Sprachen, die wichtig sind. Standard Linux "sh" und Nicht-Standard-Windows "bat" (a/k/a cmd.exe) und das ist alles, was es heutzutage gibt. [Als ich ein Kind war, gab es Open VMS DCL und Data Generals seltsame Shell-Sprache und RSX-11 und alle möglichen tollen Sachen. Gott sei Dank für den Posix-Standard.]

Spiel.

sh
python -O game.py 

game.bat

python -O game.py 

Interessanterweise sind die Dateien sind die gleichen, nur die Verlängerung (und das Dateiformat) musste geändert werden, die verschiedene Betriebssysteme glücklich zu machen.

Wenn Sie wollen True eine Größe passt für alle Cross-Plattform, müssen Sie daran denken, dass Python eine Shell-Sprache ist. So etwas funktioniert auch.

game-startup.py

import subprocess 
subprocess.Popen("python -O game.py") 
+0

Danke! Ich mag es, wenn ein Problem eine schöne einfache Lösung hat. – timday

2

Ihre Frage zu beantworten (als gegensätzliche Ihr Problem zu Fixierung, die S. Lott tat perfekt), ich denke, eine Menge Zeit Menschen, die Python-Code verteilen nicht machen Sie sich darüber Sorgen, weil das Optimierungs-Flag nur selten Wirkung zeigt. Ich glaube, Pyglet ist die einzige Ausnahme, von der ich seit Jahren gehört habe, als ich Python benutzt habe. Zitat aus der Python docs, "Der Optimierer hilft derzeit nicht viel; er entfernt nur Assert-Anweisungen".

+0

Gleichermaßen: Dies ist das erste Mal, dass ich gesehen habe, dass die Optimierungsmarkierung irgendeinen bemerkbaren Unterschied zu irgendeinem Python-Code macht. Der Code, der mich veranlaßte, die Frage zu stellen, verwendet eine große Anzahl von "Sofortmodus" GL-Anrufen; Ich vermute (nicht überprüft) pyglet macht verschiedene behauptet (wahrscheinlich einschließlich ein glGetError) für jeden einzelnen und alles summiert sich. – timday

+3

Aber -OO entfernt alle Docstrings, was zu Überraschungen führen kann. Matplotlib verwendet programmatisch konstruierte Docstrings, z. % s tritt in den Docstring zurück, die durch f .__ doc__ = f .__ doc__% kwdict ersetzt werden, was bei der Ausführung mit -OO zu einem Fehler führt. –

Verwandte Themen