Ya no busques más por otras páginas porque estás al espacio perfecto, tenemos la respuesta que quieres recibir sin liarte.
Solución:
Según la documentación, en lugar de
execfile("./filename")
Usar
exec(open("./filename").read())
Ver:
- Novedades en Python 3.0
Se supone que solo debe leer el archivo y ejecutar el código usted mismo. 2to3 actual reemplaza
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
Tiempo exec(open("filename").read())
a menudo se da como una alternativa a execfile("filename")
se pierden detalles importantes que execfile
soportado.
La siguiente función para Python3.x es lo más cerca 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 binaria 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__"
- Ajuste
__file__
es mejor para los mensajes de excepción y algunos scripts usan__file__
para obtener las rutas de otros archivos relativos a ellos. -
Toma argumentos globales y locales opcionales, modificándolos en el lugar como
execfile
hace, por lo que puede acceder a cualquier variable definida leyendo las variables después de ejecutar. -
A diferencia de Python2
execfile
esto hace no modificar el espacio de nombres actual de forma predeterminada. Para eso tienes que pasar explícitamenteglobals()
&locals()
.
Te mostramos reseñas y calificaciones
Acuérdate de que te brindamos la opción de añadir una puntuación correcta si encontraste tu dilema justo a tiempo.