1

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?

+0

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

Répondre

0

vous pouvez faire la version simultanée des modules (plugins) pour l'importation de ceux-ci. Une autre façon est d'interroger le dossier où sont les modules et de les trier (une sorte de modèle de flux de travail) et de supprimer les doublons s'ils existent. En général, les machines d'importation ne devraient pas se soucier de ce que vous voulez! il est en micro-modèle et suppose que vous préparerez harnais pour le chargement. J'ai ci-dessus dans toutes mes applications et aime le fait que je reçois tout le câblage en place pour charger tout ce que je désire et le spectre est incroyable, de la ligne de commande aux pipelines ML ...