Dynamiquement à l'importation d'une méthode dans un fichier, à partir d'une chaîne
J'ai une chaîne de caractères, dire: abc.def.ghi.jkl.myfile.mymethod
. Comment puis-je importer dynamiquement mymethod
?
Ici est de savoir comment je suis allé à ce sujet:
def get_method_from_file(full_path):
if len(full_path) == 1:
return map(__import__,[full_path[0]])[0]
return getattr(get_method_from_file(full_path[:-1]),full_path[-1])
if __name__=='__main__':
print get_method_from_file('abc.def.ghi.jkl.myfile.mymethod'.split('.'))
Je me demandais si la importer des modules est nécessaire à tous.
Edit: je suis en utilisant la version de Python 2.6.5.
Vous devez vous connecter pour publier un commentaire.
De Python 2.7 vous pouvez utiliser le importlib.import_module() fonction. Vous pouvez importer un module et d'accéder à un objet défini avec le code suivant:
importlib.import_module()
sur__import__()
: docs.python.org/2/library/functions.html#__import__ -- 2,7+.import_module
+rsplit
= Le seul Vrai Chemin.Vous n'avez pas besoin d'importer des modules individuels. Il suffit d'importer le module que vous souhaitez importer un nom et de fournir les
fromlist
argument:Pour votre exemple
abc.def.ghi.jkl.myfile.mymethod
, appeler cette fonction en tant que(À noter qu'au niveau du module les fonctions sont appelées fonctions en Python, pas de méthodes.)
Pour une telle tâche simple, il n'y a aucun avantage en utilisant le
importlib
module.myClass = getattr(__import__("module.to.import", fromlist=["myClassName"]), "myClassName")
. Merci pour l'aide!__import__
approche fonctionne. Mais essayez d'exécuterhelp(__import__)
. Il dit: "Parce que cette fonction est destinée à être utilisée par l'interpréteur Python, et non pour un usage général, il est préférable d'utiliserimportlib.import_module()
de programmation pour importer un module".importlib
à la place.Pour Python < 2.7 le groupe builtin méthode __ import__ peut être utilisé:
Pour Python >= 2.7 ou 3.1 la méthode pratique importlib.import_module a été ajouté. Il suffit d'importer votre module comme ceci:
Mise à jour: version mise à Jour en fonction des commentaires (je dois avouer que je n'ai pas lu la chaîne à être importés jusqu'à la fin et j'ai raté le fait qu'une méthode d'un module doit être importée et pas un module lui-même):
Python < 2.7 :
Python >= 2.7:
__import__()
etimportlib.import_module()
.Il est difficile de savoir ce que vous essayez de faire de votre espace de noms local. Je suppose que vous voulez juste
my_method
comme un local, en tapantoutput = my_method()
?Alors que vous n'ajoutez
my_method
à l'espace de noms local, vous ne charge de la chaîne de modules. Vous pouvez regarder à des changements en regardant les touches desys.modules
avant et après l'importation. J'espère que c'est plus clair et plus précis que vos autres réponses.Pour la perfection, c'est de cette façon que vous ajoutez à l'ensemble de la chaîne.
Et, enfin, si vous utilisez
__import__()
et qui ont modifié vous recherchez le chemin d'accès après le début du programme, vous devrez peut-être utiliser__import__(normal args, globals=globals(), locals=locals())
. Le pourquoi est un complexe de discussion.the_module
etsame_module
est erroné et peut produire des résultats différents. Downvoting.Ce site web a une belle solution: load_class. Je l'utilise comme ceci:
Comme demandé, voici le code à partir du lien web:
La façon dont j'ai tendance à présent (ainsi qu'un certain nombre d'autres bibliothèques, tels que les pylônes et les coller, si ma mémoire est bonne) est de séparer le nom du module à partir de la fonction/le nom de l'attribut à l'aide d'un ':' entre eux. Voir l'exemple suivant:
'abc.def.ghi.jkl.myfile:mymethod'
Cela rend le
import_from(path)
fonction ci-dessous un peu plus facile à utiliser.Comment à ce sujet :
Utilisation
importlib
(2.7+ uniquement).from __future__
chose?__future__
est pour les fonctionnalités de langage, pas de nouvelles stdlib modules.__import__
comme dans les exemples ci-dessus. Il fonctionne de 2.5 et, sans mots-clés, avant que.