2010-10-30 5 views
5

J'écris une applet python pour l'acquisition de données à partir d'instruments scientifiques et j'essaie de trouver la meilleure façon de gérer les pilotes de mon périphérique.Chargement différé des modules en python

Chaque pilote est représenté par un module python distinct dans le package qui est mon programme. Ils implémentent chacun une interface standard, mais la plupart du temps c'est une liste gigantesque de commandes (et de mappages de fonctions) spécifiques à chaque périphérique et bus impliqués. À long terme, (j'écris ceci pour mon groupe de laboratoire et je prévois de supporter quelques douzaines de dispositifs), je veux éviter de les charger tous en même temps. Au lieu de cela, au moment de l'exécution, je veux lire une liste de modules dans un dictionnaire/une liste, puis les charger uniquement lorsqu'ils sont réellement nécessaires. Lorsque l'utilisateur souhaite utiliser un nouveau périphérique, il sélectionne le pilote à utiliser et transmet le nom au sous-système du pilote qui vérifie ensuite si ce pilote figure dans la liste des modules chargés, et s'il ne l'est pas. , il appelle la fonction __import__ et charge le pilote puis instancie un objet périphérique en utilisant le pilote et le remet à l'utilisateur à utiliser.

Ma question est: Quelle est la meilleure façon d'obtenir une liste de tous les modules d'une manière relative? Qu'est-ce que je veux dire, si je sais que les pilotes sont situés dans ..drivers est-il un moyen d'obtenir une liste ordonnée de modules dans ce sous-paquet? Pour illustrer: habituellement j'appelle juste from ..drivers import driver_name pour importer le module, mais puisque je ne suis pas garanti pour être dans le répertoire de paquet, ne pouvons pas simplement nous os pour obtenir une liste de noms de modules.

Dans tous les cas, des idées (même peut-être un meilleur moyen d'accomplir ce que je veux - "pilotes" chargeables) seraient appréciées.

Répondre

3

Si l'emplacement des packages de pilotes est connu, vous pouvez utiliser le chemin absolu vers le (s) dossier (s) du pilote.

Je pense qu'une approche plus robuste serait d'avoir une liste de tous les pilotes connus pour votre programme, peut-être avec un peu de métadonnées afin que les utilisateurs puissent les choisir plus facilement. Vous pourriez demander aux conducteurs de s'enregistrer eux-mêmes, ou les enregistrer vous-même si vous connaissez des emplacements probables. L'un des avantages de l'enregistrement des pilotes est que vous pouvez avoir des fichiers python autres que les pilotes dans les répertoires des packages de pilotes.

Modifier

Pour qu'un conducteur «s'enregistrer, » vous pourriez faire quelque chose comme ceci:

if __name__ == "__main__": 
    import mamapackage 
    mamapackage.register("thisdriver", 
       os.path.abspath(__file__), 
       "A description of this driver") 

Ensuite, dans votre propre paquet, fournir une fonction « registre » qui met à jour une liste des pilotes, avec leurs emplacements et descriptions (un simple fichier texte devrait faire pour les débutants). Pourquoi ne pas faire un paquet de tous les pilotes?

+0

Comment procéder pour que les pilotes s'inscrivent eux-mêmes? Les implémenter avec de petits scripts pour trouver mon logiciel et s'enregistrer? ou quelque chose de plus intelligent? – crasic

+0

Merci pour la bonne suggestion, j'implémente un simple fichier texte pour contenir les noms de pilotes et les métadonnées, peut-être pas la meilleure solution à long terme (quand les gens voudront importer des pilotes externes), mais fonctionne pour le moment. – crasic

3

Il y a pkgutil qui a iter_modules. (Note: The Python 2 documentation ne mentionne pas cette fonction, mais il fonctionne très bien pour moi sur Python 2.6.)

Vous pouvez aussi le faire manuellement à l'aide __file__, os.path et os.listdir.

0

Ensuite, vous pouvez

import drivers 
drivers.load("device1") 

où la fonction load gère un mappage de nom du périphérique au module dans le paquet?Ensuite, vous pouvez importer dynamiquement chacun des modules requis si nécessaire ...

Questions connexes