¿Cuál es una alternativa al archivo exec en Python 3?

Resuelto R S asked hace 15 años • 12 respuestas

Parece que cancelaron en Python 3 todas las formas sencillas de cargar rápidamente un script eliminando execfile().

¿Hay alguna alternativa obvia que me falta?

R S avatar Jan 13 '09 00:01 R S
Aceptado

Según la documentación , en lugar de

execfile("./filename") 

Usar

exec(open("./filename").read())

Ver:

  • Novedades de Python 3.0
  • execfile
  • exec
 avatar May 16 '2013 01:05

Se supone que debes leer el archivo y ejecutar el código tú mismo. 2to3 reemplazos actuales

execfile("somefile.py", global_vars, local_vars)

como

with open("somefile.py") as f:
    code = compile(f.read(), "somefile.py", 'exec')
    exec(code, global_vars, local_vars)

(La llamada de compilación no es estrictamente necesaria, pero asocia el nombre del archivo con el objeto de código, lo que facilita un poco la depuración).

Ver:

  • http://docs.python.org/release/2.7.3/library/functions.html#execfile
  • http://docs.python.org/release/3.2.3/library/functions.html#compile
  • http://docs.python.org/release/3.2.3/library/functions.html#exec
Benjamin Peterson avatar Jan 13 '2009 03:01 Benjamin Peterson

Si bien exec(open("filename").read())a menudo se presenta como una alternativa execfile("filename"), omite detalles importantes que la execfilerespaldan.

La siguiente función para Python3.x es lo más cercano que pude llegar a tener el mismo comportamiento que ejecutar un archivo directamente. Eso coincide con correr python /path/to/somefile.py.

def execfile(filepath, globals=None, locals=None):
    if globals is None:
        globals = {}
    globals.update({
        "__file__": filepath,
        "__name__": "__main__",
    })
    with open(filepath, 'rb') as file:
        exec(compile(file.read(), filepath, 'exec'), globals, locals)

# Execute the file.
execfile("/path/to/somefile.py")

Notas:

  • Utiliza lectura de archivos binarios para evitar problemas de codificación.

  • Garantizado 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 __file__es mejor para mensajes de excepción y algunos scripts se utilizan __file__para obtener las rutas de otros archivos relacionados con ellos.

  • Toma argumentos globales y locales opcionales, modificándolos en el lugar al igual que execfilelo hace, para que pueda acceder a cualquier variable definida leyendo las variables después de la ejecución.

  • A diferencia de Python2, execfileesto no modifica el espacio de nombres actual de forma predeterminada. Para eso tienes que pasar explícitamente globals()& locals().

ideasman42 avatar Jan 15 '2017 06:01 ideasman42