2012-07-13 14 views
9

Estoy buscando compilar un conjunto bastante grande de módulos y paquetes de python para pyo. Sé que esto es posible configurando la variable de entorno PYTHONOPTIMIZE o especificando -O en el inicio. Me gustaría aplicar pyo en lugar de pyc para obtener la menor huella posible. Para hacer eso en mi módulo de implementación, tengo que crear un script de envoltura que inicie el guión real con la opción -O, porque la variable de entorno debe especificarse antes de iniciar el intérprete.Compilación de archivos .py en .pyo sin recurrir a un script de contenedor

¿Hay alguna forma de evitar esto y aplicar la creación de pyo programáticamente?

Saludos cordiales, Thorsten

Respuesta

17

Para compilar todos los módulos de antemano, ejecute el siguiente comando:

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

El python compileall module se encarga de la compilación, el -O switch hace que los archivos de salida .pyo.

Sin embargo, no se puede forzar a Python para utilizar estos menos que se dé el interruptor -O para cada ejecución o la PYTHONOPTIMIZE environment var se establece.

Tenga en cuenta que todo lo que hace el distintivo -O es deshabilitar la instrucción assert y establecer el indicador __debug__ en False (y Python optimizará las pruebas). Especificar -OO y docstrings se eliminan. Estos no representan una gran diferencia de velocidad o un ahorro de espacio, a menos que use un tamaño de docstring excesivo o un código de depuración muy lento.

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

+0

Gracias por la respuesta, pero como se indicó anteriormente que sé del interruptor y me gustaría evitarlo. La razón es que esta es una herramienta de implementación y quiero evitar que las personas implementen accidentalmente dos versiones diferentes (pyc y pyo) del mismo archivo. Actualmente lo hago al envolver una llamada python.exe -O en una secuencia de comandos python a través de os.system. Eso funciona, pero es algo extraño, así que me preguntaba si podría deshacerme de eso. –

+0

Sería bueno poder controlarlo programáticamente (más fácilmente) ... – martineau

+0

"Tenga en cuenta que todo lo que hace el distintivo -O es deshabilitar la instrucción assert. Especificar -OO y docstrings se eliminan. Esto no representa mucha diferencia de velocidad o ahorro de espacio ". <- Eso realmente depende de cuántas declaraciones 'assert' y' if __debug__' tienes, ¿no? Ya sabes lo que dicen sobre las suposiciones. – DylanYoung

Cuestiones relacionadas