2009-07-07 10 views
5

J'ai joué avec pyglet. C'est très gentil. Cependant, si je lance mon code, qui est dans un fichier exécutable (appeler game.py) préfixé avec l'habituelContrôle par programme de l'optimisation python?

#!/usr/bin/env python 

en faisant

./game.py 

alors il est un peu maladroit. Mais si je le dirige avec

python -O ./game.py 

ou

PYTHONOPTIMIZE=1 ./game.py 

alors son super-lisse.

Je ne m'inquiète pas beaucoup pourquoi il fonctionne lentement sans optimisation; La documentation de pyglet mentionne que l'optimisation désactive de nombreuses assertions et aussi la vérification d'erreurs d'OpenGL, et je suis heureux de m'en tenir là.

Ma question est: comment les gens distribuant du code Python s'assurent-ils que les utilisateurs finaux (sans intérêt pour le débogage ou la modification du code) exécutent la version optimisée du code. Il y a sûrement un meilleur moyen que de simplement dire aux gens de s'assurer qu'ils utilisent l'optimisation dans les notes de mise à jour (qu'ils ne liront probablement pas de toute façon).

Sur Linux, je peux facilement fournir un script ./game pour exécuter le fichier pour les utilisateurs finaux:

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

mais ce n'est pas très multiplateformes.

J'ai une idée que je devrais être en mesure de changer la ligne #! à

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

ou

#!/usr/bin/env python -O 

mais ceux qui ne semblent pas fonctionner comme prévu, et je ne suis pas sûr de ce qu'ils feraient sur Windows.

Existe-t-il un moyen de contrôler l'optimisation à l'intérieur du code que je ne connais pas? Quelque chose comme:

import runtime 
    runtime.optimize(True) 

Ce qui est considéré comme les meilleures pratiques dans ce domaine par des personnes SHIPPING python multi-plateforme?

+2

Ceci n'est pas une réponse, car la réponse de S.Lotts était complètement correcte et exhaustive. Allez avec game.sh et game.bat, ça marche. Mais juste un commentaire: Le #! ligne ne fait absolument rien sur Windows, c'est complètement ignoré. –

Répondre

14

"Sur Linux, je peux facilement fournir un script ./game pour exécuter le fichier pour les utilisateurs finaux:"

correcte.

"mais ce n'est pas très multiplate-forme."

Demi-correct. Il y a exactement deux langages shell qui comptent. Linux standard "sh" et Windows "bat" non standard (a/k/a cmd.exe) et c'est tout ce qu'il y a de nos jours. [Quand j'étais enfant, il y avait Open VMS DCL et le langage shell bizarre de Data General et RSX-11 et toutes sortes de trucs géniaux. Merci à Dieu pour le standard Posix.]

jeu.sh

python -O game.py 

game.bat

python -O game.py 

Fait intéressant les fichiers sont les mêmes, seule l'extension (et le format de fichier) ont dû être changé pour rendre heureux de les différents OS.

Si vous voulez true cross-plate-forme unique, vous devez vous rappeler que Python est un langage shell. Ce genre de chose fonctionne aussi.

game-startup.py

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

Merci! Je l'aime quand un problème a une belle solution simple. – timday

2

répondre à votre question (comme opposant à résoudre votre problème, que S. Lott a fait parfaitement), je pense que beaucoup de temps, les gens qui distribuent le code Python ne pas Vous vous en inquiétez, car il est rare que le drapeau d'optimisation ait un effet. Je crois que Pyglet est la seule exception dont j'ai entendu parler pendant des années d'utilisation de Python. Citant le Python docs, "L'optimiseur n'aide pas beaucoup actuellement, il ne supprime que les instructions assert".

+0

De même: c'est la première fois que j'ai vu l'indicateur d'optimisation faire une différence notable à tout code python. Le code qui m'a amené à poser la question utilise un grand nombre d'appels GL «mode immédiat»; Je soupçonne (je n'ai pas vérifié) que pyglet fait des assertions diverses (incluant probablement un glGetError) pour chacun d'entre eux et tout cela s'additionne. – timday

+3

Mais -OO supprime tous les docstrings, ce qui peut entraîner des surprises. Matplotlib utilise des docstrings construites par programme, par ex. % s s'échappe dans la docstring qui est remplacée par f .__ doc__ = f .__ doc__% kwdict, ce qui provoque une erreur lors de l'exécution avec -OO. –