Obtenir le chemin d'importation de la fonction
from pack.mod import f
Comment obtenir de l'objet f informations sur l'importation - 'pack.mod'
Je peux l'obtenir à l'aide de f.__module__
mais si la fonction def dans le module où je reçois cet attribut (f.__module__
) retour '__main__'
. Mais j'ai besoin de vrais chemin ici - 'pack.mod'
J'ai trouvé ce moyen pour obtenir cette information:
inspect.getmodule(f).__file__
alors je peux démarrer sous chemin de sys.path
remplacer /
sur .
et obtenir chemin comme - 'pack.mod'
Mais peut-être existe un moyen plus pratique?
source d'informationauteur evg
Vous devez vous connecter pour publier un commentaire.
Ce
inspect.getmodule(f)
n'en interne, par inspect.py'sourcesest essentiellementsys.modules.get(object.__module__)
-- je ne le ferais pas appel à l'aide de ce code directement "plus pratique", mais (au-delà de la "substance" de la partie,inspect
a beaucoup de utile d'attraper et de correction de coin des cas).Pourquoi ne pas appeler directement inspecter.getsourcefile(f)?
Modifier: lire entre les lignes, il semble que l'OP est en train de faire quelque chose comme
et dans
bla.py
(qui est donc en cours d'exécution comme__main__
) déterminer "ce quifrom
ouimport
déclaration pourrait un autre script principal d'importer à cette fonction à partir de l'intérieur de moi?".Problème est que la question est mal posé, car il pourrait ne pas être tout telle voie utilisable pour la fin (rien ne garantit l'actuel chemin du script est sur
sys.path
lors que les différents principale du script est exécuté plus tard), il peut y avoir plusieurs différents (par exemple, les deux/foo/bar
et/foo/bar/baz
peut-être sursys.path
et/foo/bar/baz/__init__.py
existe pas, auquel casfrom baz.bla import f
etfrom bla import f
pourrait à la fois le travail), et rien ne garantit que certains autresprécédentsys.path
élément peut pas "préempter" la tentative d'importation (par exemple, dire/foo/bar/baz
est sursys.path
mais avant cela il y a aussi/fee/fie/foo
et complètement indépendants fichier/fee/fie/foo/bla.py
existe aussi -- etc, etc).Quel que soit le but de ce type de découverte tentative, je suggère de trouver un autre architecture -- par exemple, celui où
from baz.bla import f
est exécuté (comme l'OP dit au début de la question), de sorte quef.__module__
est correctement mise en place debaz.bla
.Vous voulez le
__name__
attribut de__module__
: