¿Alternativa a execfile en Python 3?
python-3.x import (4)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cuál es una alternativa a execfile en Python 3? 12 respuestas
Python 2 tenía la función incorporada execfile
, que se eliminó en Python 3.0. Esta pregunta discute alternativas para Python 3.0, pero se han realizado algunos cambios considerables desde Python 3.0 .
¿Cuál es la mejor alternativa para execfile
para Python 3.2 y futuras versiones de Python 3.x ?
El script 2to3
(también el de Python 3.2) reemplaza
execfile(filename, globals, locals)
por
exec(compile(open(filename, "rb").read(), filename, ''exec''), globals, locals)
Esta parece ser la recomendación oficial.
En Python3.x esto es lo más cercano que pude encontrar para ejecutar un archivo directamente, que coincide con la ejecución de python /path/to/somefile.py
.
Notas:
- Utiliza lectura binaria para evitar problemas de codificación
- Garenteed para cerrar el archivo (Python3.x advierte sobre esto)
- define
__main__
, algunos scripts dependen de esto para verificar si se están cargando como un módulo o no, por ejemplo.if __name__ == "__main__"
- la configuración de
__file__
es más agradable para los mensajes de excepción y algunos scripts usan__file__
para obtener las rutas de otros archivos relacionados con ellos.
def exec_full(filepath):
import os
global_namespace = {
"__file__": filepath,
"__name__": "__main__",
}
with open(filepath, ''rb'') as file:
exec(compile(file.read(), filepath, ''exec''), global_namespace)
# execute the file
exec_full("/path/to/somefile.py")
Standard runpy.run_path es una alternativa.
execfile(filename)
puede ser reemplazado por
exec(open(filename).read())
que funciona en todas las versiones de Python