web-dev-qa-db-fra.com

Alternative à execfile dans Python 3?

Python 2 avait la fonction intégrée execfile , qui a été supprimée dans Python 3.0. Cette question discute des alternatives pour Python 3.0, mais certains changements considérables ont été effectués depuis Python 3. =.

Quelle est la meilleure alternative à execfile pour Python 3.2, et futures versions Python 3.x ?

49
Matt Joiner

Le 2to3 le script (également celui de Python 3.2) remplace

execfile(filename, globals, locals)

par

exec(compile(open(filename, "rb").read(), filename, 'exec'), globals, locals)

Cela semble être la recommandation officielle.

58
Sven Marnach
execfile(filename)

peut être remplacé par

exec(open(filename).read())

qui fonctionne dans toutes les versions de Python

47
Lennart Regebro

Dans Python3.x, c'est la chose la plus proche que j'ai pu trouver pour exécuter un fichier directement, qui correspond à l'exécution de python /path/to/somefile.py.

Remarques:

  • Utilise la lecture binaire pour éviter les problèmes d'encodage
  • Garenteed pour fermer le fichier (Python3.x vous en avertit)
  • définit __main__, certains scripts en dépendent pour vérifier s'ils se chargent en tant que module ou non, par exemple. if __== "__main__"
  • réglage __file__ est plus agréable pour les messages d'exception et certains scripts utilisent __file__ pour obtenir les chemins des autres fichiers par rapport à eux.
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")
7
ideasman42

Standard runpy.run_path est une alternative.

2
eudoxos