Il semble qu'ils aient annulé dans Python 3 tout le moyen facile de charger rapidement un script en supprimant execfile()
Y a-t-il une alternative évidente qui me manque?
Il semble qu'ils aient annulé dans Python 3 tout le moyen facile de charger rapidement un script en supprimant execfile()
Y a-t-il une alternative évidente qui me manque?
reload
est de retour, puisqueimp.reload
, depuis 3.2.%run script_name
fonctionne avec toutes les versions de Python.imp
estimportlib
(qui doit être importé):importlib.reload(mod_name)
importe et exécutemod_name
.runfile()
car j'avais besoin d'exécuter un script Python qui s'exécute dans son propre espace de noms (par opposition à l'exécution sur l' espace de noms appelant ). Mon application: ajoutez le répertoire du script appelé au chemin système (sys.path
) en utilisant l'__file__
attribut: si nous utilisonsexecfile()
ou son équivalent en Python 3 (exec(open('file.py').read())
) le script inclus est exécuté dans l'espace de noms appelant et se__file__
résout ainsi en nom de fichier appelant .Réponses:
Selon la documentation , au lieu de
Utilisation
Voir:
la source
close
également gérer ce fichier. Une autre raison de ne pas aimer le changement de python 2.Vous êtes juste censé lire le fichier et exécuter le code vous-même. 2to3 remplacements actuels
comme
(L'appel de compilation n'est pas strictement nécessaire, mais il associe le nom de fichier à l'objet de code, ce qui facilite le débogage.)
Voir:
la source
exec
est une instruction en python2,exec(code)
fonctionne parce que les parens sont simplement ignorés."somefile.py"
contenuinspect.getsourcefile(lambda _: None)
qui échouait sans la compilation, car leinspect
module ne pouvait pas déterminer d'où venait le code.open("somefile.py")
peut être incorrect sisomefile.py
un codage de caractères différent delocale.getpreferredencoding()
.tokenize.open()
pourrait être utilisé à la place.Bien qu'il
exec(open("filename").read())
soit souvent donné comme alternative àexecfile("filename")
, il manque des détails importants qui ont étéexecfile
pris en charge.La fonction suivante pour Python3.x est aussi proche que possible d'avoir le même comportement que l'exécution directe d'un fichier. Cela correspond à la course
python /path/to/somefile.py
.Remarques:
__main__
, certains scripts en dépendent pour vérifier s'ils se chargent en tant que module ou non, par exemple.if __name__ == "__main__"
__file__
est plus agréable pour les messages d'exception et certains scripts permettent__file__
d'obtenir les chemins des autres fichiers par rapport à eux.Prend des arguments facultatifs globaux et locaux, les modifiant en place comme le
execfile
fait - afin que vous puissiez accéder à toutes les variables définies en relisant les variables après l'exécution.Contrairement à Python2,
execfile
cela ne modifie pas l'espace de noms actuel par défaut. Pour cela, vous devez explicitement passer dansglobals()
&locals()
.la source
Comme suggéré récemment sur la liste de diffusion python-dev , le module runpy pourrait être une alternative viable. Citant ce message:
Il existe de subtiles différences pour
execfile
:run_path
crée toujours un nouvel espace de noms. Il exécute le code en tant que module, il n'y a donc pas de différence entre les globaux et les locaux (c'est pourquoi il n'y a qu'uninit_globals
argument). Les globaux sont retournés.execfile
exécuté dans l'espace de noms actuel ou l'espace de noms donné. La sémantique delocals
etglobals
, si elle est donnée, était similaire aux sections locales et globales dans une définition de classe.run_path
peut non seulement exécuter des fichiers, mais aussi des œufs et des répertoires (reportez-vous à sa documentation pour plus de détails).la source
file_globals
? Cela éviterait d'avoir à taper lefile_globals['...']
pour chaque variable.Celui-ci est meilleur, car il prend les globaux et les locaux de l'appelant:
la source
execfile
. Cela a même fonctionné pour moi lors de l'utilisation de pytests où d'autres solutions publiées ci-dessus ont échoué. THX! :)Vous pouvez écrire votre propre fonction:
Si vous aviez vraiment besoin de ...
la source
globals
etlocals
pointe vers l'espace de noms global du module contenant la définition deexecfile()
plutôt que vers l'espace de noms global et local de l'appelant. L'approche correcte consiste à utiliserNone
comme valeur par défaut et à déterminer les paramètres globaux et locaux de l'appelant via les capacités d'introspection duinspect
module.Si le script que vous souhaitez charger se trouve dans le même répertoire que celui que vous exécutez, peut-être que "import" fera le travail?
Si vous devez importer dynamiquement du code, la fonction intégrée __ import__ et le module imp valent la peine d'être examinés .
test.py:
Si vous utilisez Python 3.1 ou une version ultérieure, vous devriez également jeter un œil à importlib .
la source
importlib
dev.to/0xcrypto/dynamic-importing-stuff-in-python--1805Voici ce que j'avais (
file
est déjà affecté au chemin d'accès au fichier avec le code source dans les deux exemples):Voici ce que je l'ai remplacé:
Ma partie préférée: la deuxième version fonctionne très bien en Python 2 et 3, ce qui signifie qu'il n'est pas nécessaire d'ajouter une logique dépendante de la version.
la source
Notez que le modèle ci-dessus échouera si vous utilisez des déclarations d'encodage PEP-263 qui ne sont pas ascii ou utf-8. Vous devez trouver l'encodage des données et les encoder correctement avant de les transmettre à exec ().
la source
De plus, bien qu'il ne s'agisse pas d'une solution Python pure, si vous utilisez IPython (comme vous le devriez probablement de toute façon), vous pouvez faire:
Ce qui est tout aussi simple.
la source
Je suis juste un débutant ici, alors c'est peut-être de la chance si je trouve ça:
Après avoir essayé d'exécuter un script à partir de l'invite d'interpréteur >>> avec la commande
pour lequel j'ai obtenu un "NameError: le nom 'execfile' n'est pas défini" J'ai essayé un très basique
cela a bien fonctionné :-)
J'espère que cela peut être utile et merci à tous pour les excellents conseils, exemples et tous ces morceaux de code magistralement commentés qui sont une grande inspiration pour les nouveaux arrivants!
J'utilise Ubuntu 16.014 LTS x64. Python 3.5.2 (par défaut, 17 novembre 2016, 17:05:23) [GCC 5.4.0 20160609] sur linux
la source
Pour moi, l'approche la plus propre est d'utiliser
importlib
et d'importer le fichier en tant que module par chemin, comme ceci:Exemple d'utilisation
Ayons un fichier
foo.py
:Maintenant, importez-le et utilisez-le comme un module normal:
Je préfère cette technique aux approches directes comme
exec(open(...))
parce qu'elle n'encombre pas vos espaces de noms ou ne gâche pas inutilement$PATH
.la source