J'écris un applet Python pour l'acquisition de données d'instruments scientifiques et j'essaie de comprendre le meilleur moyen de gérer mes "pilotes" de votre appareil. P>
Chaque pilote est représenté par un module Python séparé dans l'emballage mon programme. Ils implémentent chacun une interface standard, mais surtout une liste gigantesque de commandes (et de mappages de fonction) spécifiques à chaque appareil et à chaque bus impliqué. À long terme, (j'écris ceci pour mon groupe de laboratoire et envisagez de soutenir quelques dizaines de dispositifs ou plus), je souhaite éviter de les charger à la fois. Au lieu de cela, au moment de l'exécution, je veux lire dans une liste de modules dans un dictionnaire / liste, puis les charger que lorsqu'ils sont effectivement nécessaires. p>
Lorsque l'utilisateur souhaite utiliser un nouveau périphérique, il sélectionne le pilote à utiliser et transmet le nom sur le sous-système de pilote qui vérifie ensuite si ce pilote est dans la liste des modules chargés, et si ce n'est pas le cas, Il appelle la fonction Ma question est la suivante: quelle est la meilleure façon d'obtenir une liste de tous les modules de manière relative? Ce que je veux dire, c'est que si je sais que les pilotes sont situés dans Dans tous les cas, toutes les idées (même peut-être une meilleure façon d'accomplir ce que je veux - chargable «pilotes») serait apprécié. P> __ import __ code> et charge le pilote dans ensuite instancie d'un objet de périphérique à l'aide du pilote et remettez-le à l'utilisateur à utiliser. P>
.. Pilotes code> est un moyen d'obtenir une liste de modules bien rangée dans ce sous-pacakage? Pour illustrer: Habituellement, je viens d'appeler
de ..Drivers importer pilote_name code> pour importer le module, mais comme je ne suis pas garanti d'être dans em> le répertoire de packages, vous ne pouvez pas simplement US
OS code> pour obtenir une liste de noms de module. P>
3 Réponses :
Il y a Vous pouvez également le faire manuellement en utilisant pkgutil code>
qui a iter_modules code>. (Remarque: La documentation Python 2 ne mentionne pas cette fonction, mais cela fonctionne simplement bien Pour moi sur Python 2.6.) P>
__ fichier __ code>,
os.path code> et
os.listdir code>. p>.
Si l'emplacement des packages de pilote est connu, vous pouvez utiliser la trajectoire absolue vers le ou les dossiers de 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 avoir les pilotes s'inscrire eux-mêmes ou les enregistrer vous-même si vous connaissez des emplacements probables. Un avantage d'avoir les pilotes s'inscrivent-il à eux-mêmes est que vous pourriez avoir des fichiers python autres que des pilotes dans les répertoires de paquet de pilote. P>
EDIT STRY> P> Pour un conducteur à "Inscrivez-vous lui-même," Vous pouvez faire quelque chose comme ceci: p> puis dans votre propre package, fournissez une fonction "registre" qui met à jour une liste des pilotes, avec leurs emplacements et Descriptions (un fichier texte simple devrait faire pour commencer). p> p>
Comment irais-je que les pilotes s'inscrivaient-ils eux-mêmes? Mettez-les avec de petits scripts pour trouver mon logiciel et vous inscrire eux-mêmes? ou quelque chose de plus intelligent?
Merci pour la grande suggestion, j'ai implémenter un fichier texte simple pour contenir des noms de pilote et des métadonnées, peut-être pas la meilleure solution à long terme (lorsque les personnes pourraient vouloir importer des pilotes externes), mais fonctionne définitivement comme un charme pour le moment.
Pourquoi ne pas faire un paquet de tous les pilotes? Ensuite, vous pourriez
import drivers drivers.load("device1")