453 votes

Ce qui est une alternative à execfile dans Python 3.0 ?

Il semble qu’ils ont annulé dans Python 3.0 tous un moyen facile de charger rapidement un fichier de script - execfile() tant reload().

Y a-t-il une alternative évidente, je suis absent ?

496voto

Pedro Vagner Points 415

Selon la documentation, au lieu de

Utilisation

Voir :

246voto

Benjamin Peterson Points 5277

Vous êtes seulement censés lire le fichier et exec le code vous-même. 2to3 actuelle remplace

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

comme

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

(La compilation d'appel n'est pas strictement nécessaire, mais il associe le nom de fichier avec le code objet qui fait du débogage d'un peu plus facile.)

Voir:

81voto

Jonas Wielicki Points 4624

Comme suggéré sur le python-dev mailinglist récemment, le runpy module pourrait être une alternative viable. En citant ce message:

https://docs.python.org/3/library/runpy.html#runpy.run_path

import runpy
file_globals = runpy.run_path("file.py")

Il y a de subtiles différences d' execfile:

  • run_path toujours crée un nouvel espace de noms. Il exécute le code dans un module, donc il n'y a pas de différence entre les variables globales et locales (c'est pourquoi il y a seulement un init_globals argument). Les variables globales sont retournés.

    execfile exécuté dans l'espace de noms courant ou de l'espace de noms donné. La sémantique de l' locals et globals, si elle est donnée, étaient similaires aux sections locales et variables globales à l'intérieur d'une définition de classe.

  • run_path ne peut pas seulement d'exécuter des fichiers, mais aussi les œufs et les répertoires (reportez-vous à sa documentation pour plus de détails).

17voto

Evan Fosmark Points 17732

Vous pouvez écrire votre propre fonction :

Si vous avez vraiment besoin de...

15voto

ascobol Points 2324

Si le script que vous voulez charger dans le même répertoire que celui que vous exécutez, peut-être "importer" va faire le travail ?

Si vous avez besoin d'importer dynamiquement le code de la fonction intégrée __ import__ et le module imp sont à la peine de regarder.

>>> import sys
>>> sys.path = ['/path/to/script'] + sys.path
>>> __import__('test')
<module 'test' from '/path/to/script/test.pyc'>
>>> __import__('test').run()
'Hello world!'

test.py:

def run():
        return "Hello world!"

Si vous êtes à l'aide de Python 3.1 ou version ultérieure, vous devriez également prendre un coup d'oeil à importlib.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X