Je souhaite utiliser l'API CPython C pour charger des fichiers Python en tant que plugins à partir d'une application C. Ces fichiers Python contiennent des classes et d'autres choses et je sais comment les obtenir une fois que j'ai l'objet module.Importlib: Comment importer plusieurs fichiers Python sans se soucier des noms de modules
La solution actuelle, je dois importer un fichier Python et obtenir l'objet du module est ce (Python 3):
import importlib
module = importlib.machinery.SourceFileLoader('some_module', '/path/to/file.py').load_module()
je peux faire l'équivalent avec l'API C. Ce que je comprends c'est que l'objet module est également ajouté au dictionnaire sys.modules
avec la clé some_module
. Mon problème est que, si je charge un second module, en spécifiant également some_module
comme nom de module, les noms trouvés dans le second module sont ajoutés au même module chargé que le premier, et les noms existants sont remplacés! C'est, dans ce cas:
import importlib
module = importlib.machinery.SourceFileLoader('some_module', '/path/to/file.py').load_module()
module2 = importlib.machinery.SourceFileLoader('some_module', '/path/to/file2.py').load_module()
module
et module2
sont en fait le même objet. Dans mon cas c'est mauvais parce que les deux plugins peuvent (et vont) avoir les mêmes noms globaux.
Notez que l'utilisateur de mon application peut spécifier une liste de chemins à partir desquels charger les fichiers plugin, donc les fichiers Python peuvent être situés à différents endroits, ce qui signifie également que deux plugins différents peuvent avoir le même nom de base.
Sachant cela, est ma seule option pour créer un nom de module unique à partir du chemin? Puis le dernier exemple devient:
import importlib
module = importlib.machinery.SourceFileLoader('path_to_file', '/path/to/file.py').load_module()
module2 = importlib.machinery.SourceFileLoader('path_to_file2', '/path/to/file2.py').load_module()
Est-il possible de ne pas soins sur les noms de modules réels lors de l'importation?
Pas tout à fait sûr (jamais fait), mais je pense que ce n'est pas possible si vous autorisez le chargement à partir de plusieurs endroits. Avez-vous des dépendances entre les modules, c'est-à-dire "/path/to/file.py" imports "/chemin/vers/fichier2.py"? Notez, que je pense que cette affaire est impossible de travailler :-) – mkiever