online compile all python python-3.x pyc

compile - Ejecutando sin archivos de origen Python en Python 3.4



python compile (2)

No hay suficiente reputación para agregar comentarios a la respuesta de BrenBarn. Así que aquí hay un complemento.

Según el doc. compileall :

-b Write the byte-code files to their legacy locations and names, which may overwrite byte-code files created by another version of Python. The default is to write files to their PEP 3147 locations and names, which allows byte-code files from multiple versions of Python to coexist.

Así que podrías ejecutar python -m compileall -b . para compilar todos los archivos de código en este directorio de forma recursiva.

Estoy tratando de ejecutar una aplicación de Python sin mantener los archivos de origen .py , y solo confiar en los .pyc compilados .pyc . Sin embargo, estoy recibiendo errores de importación cuando .py archivos de origen .py . Esta funcionalidad funciona en Python 2.7, pero no en 3.4 (con la nueva estructura __pycache__ ).

Aquí hay una estructura de directorio de muestra:

package/ __init__.py module.py

Python 2.7

Primero veamos qué sucede cuando uso Python 2.7 (este es el comportamiento deseado)

$ python2 -c "from package import module" $ find package -name "*.py" -delete $ python2 -c "from package import module"

Todo está bien y no se producen errores. La estructura del directorio después de hacer esto se vería así, con los archivos .pyc junto a los archivos .py originales:

package/ __init__.pyc module.pyc

Python 3.4

Ahora, hagamos lo mismo con Python 3.4, comenzando de nuevo con nuestra estructura de directorios original

$ python3 -c "from package import module" $ find package -name "*.py" -delete $ python3 -c "from package import module" Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: cannot import name ''module''

Uh oh, no puede importar el módulo. Curiosamente, aún podría ejecutar python3 -c "import package" forma segura en este punto, pero no puede sacar ningún módulo de allí. En este punto, la estructura del directorio se ve un poco diferente de lo que lo hizo en 2.7, específicamente de esta manera:

package/ __pycache__/ __init__.cpython-34.pyc module.cpython-34.pyc

Entonces la pregunta es esta: ¿por qué Python 3.4 no puede importar / ejecutar correctamente solo con archivos .pyc ? ¿Es este comportamiento deseado, lo que significa que la fuente debe mantenerse en todas las situaciones? ¿O me estoy perdiendo algo estúpido?


Según el PEP :

Es posible que el archivo foo.py se haya eliminado de alguna manera, mientras se deja el archivo pyc en caché aún en el sistema de archivos. Si el __pycache__/foo.<magic>.pyc existe, pero el archivo foo.py utilizado para crearlo no lo hace, Python generará un ImportError cuando se le pida que importe foo. En otras palabras, Python no importará un archivo pyc desde el directorio de caché a menos que exista el archivo de origen.

Pero:

Sin embargo, para continuar admitiendo las distribuciones sin fuente, si falta el archivo fuente, Python importará un archivo pyc solitario si vive donde debería haber estado el archivo fuente.

Así que parece que las distribuciones __pycache__ y __pycache__ se excluyen mutuamente. Si desea eliminar la fuente, debe mover los archivos .pyc al directorio donde debería haber estado la fuente.