Alternativa a Execfile in Python 3? [duplicare
-
28-10-2019 - |
Domanda
Questa domanda ha già una risposta qui:
- Qual è un'alternativa a Execfile in Python 3? 11 risposte
Python 2 aveva la funzione incorporata execfile
, che è stato rimosso in Python 3.0. Questa domanda discute le alternative per Python 3.0, ma alcuni Cambiamenti considerevoli sono stati fatti Da Python 3.0.
Qual è la migliore alternativa a execfile
per Python 3.2, e versioni future python 3.x?
Soluzione
Il 2to3
Lo script (anche quello in Python 3.2) sostituisce
execfile(filename, globals, locals)
di
exec(compile(open(filename, "rb").read(), filename, 'exec'), globals, locals)
Questa sembra essere la raccomandazione ufficiale.
Altri suggerimenti
execfile(filename)
può essere sostituito con
exec(open(filename).read())
che funziona in tutte le versioni di Python
In python3.x questa è la cosa più vicina che potrei inventare per eseguire direttamente un file, che corrisponde in esecuzione python /path/to/somefile.py
.
Appunti:
- Utilizza la lettura binaria per evitare i problemi di codifica
- Garentheed per chiudere il file (Python3.x ne avverte)
- definisce
__main__
, alcuni script dipendono da questo per verificare se si stanno caricando come modulo o meno per EG.if __name__ == "__main__"
- ambientazione
__file__
è più bello per i messaggi di eccezione e alcuni script usano__file__
Per ottenere i percorsi di altri file relativi ad essi.
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 è un'alternativa.