Liste de tous les modules qui font partie d'un paquet python?
Est-il un moyen simple pour trouver tous les modules qui font partie d'un paquet python? J'ai trouvé cette ancienne discussion, ce qui n'est pas vraiment concluant, mais j'aimerais avoir une réponse définitive avant que je roule ma propre solution basée sur le système d'exploitation.listdir().
- Question Bonus: comment importer de la trouvé de modules de bien?
- Quel est le problème avec la lecture de la source de répertoire? Ce plus d'informations avez-vous besoin? Quel est le problème avec
ls
(oudir
)? - Il y a plus de solutions générales disponibles, les paquets python ne sont pas toujours dans les répertoires du système de fichiers, mais peut également être à l'intérieur de fermetures à glissière.
- Fermetures à glissière peut être trivialement examiné pour voir le contenu. Je ne comprends pas la question. Ce besoin de plus de renseignements que ce qui est trivialement disponible ordinaire OS techniques? J'espère un peu de clarté quant à ce précieux morceau de l'information est manquante.
- pourquoi réinventer la roue? Si python acquiert hypermodules en Python 4, pkgutil et mis à jour pour que mon code fonctionne toujours. J'aime utiliser des abstractions qui sont disponibles. L'utilisation évidente de la méthode, il est testé et connu pour le travail. Réimplanter que.. maintenant, vous devez trouver et de travailler autour de chaque coin de cas de vous-même.
- Ah, ce est tout au sujet de programmatiques découverte des submodules. Le code que j'ai posté vient à partir d'une application qui charge les plugins qui sont submodules pour les plugins paquet -- il n'est pas nécessaire de garder un manuel de l'indice dans le programme, depuis pkgutil la liste des plugins disponibles.
- Ce que l'index du mode d'emploi? Je ne comprends pas la question. Quel est le problème avec
ls
? Quand je veux savoir les modules dans un paquet, j'ai utiliserls -r
sur le système de fichiers. Ou je décompressez l'œuf et l'utilisationls -r
. Pourquoi est-ce insuffisant? Quoi de plus est nécessaire? - Donc, chaque fois que le démarrage de l'application, il va décompresser son propre oeuf si installé à l'intérieur juste pour le vérifier? Veuillez soumettre un patch contre mon projet de réinventer la roue dans cette fonction: git.gnome.org/cgit/kupfer/tree/kupfer/plugins.py#n17. Veuillez considérer à la fois les œufs et normal répertoires, ne pas dépasser 20 lignes.
- Comment fonctionne "à chaque fois que l'application démarre, il va décompresser son propre oeuf" ont rien à voir avec cette question? Veuillez clarifier cette question. Pourquoi un
ls
pas suffisant? Merci de se concentrer sur pourquoi, dans cette question, lels
n'est pas adéquate. Je veux seulement des éclaircissements sur le sens de cette question. - Êtes-vous demander à propos d'un manuel
ls
par moi dans la coque, ou réelleos.popen("ls").read()
ou pensez-vous vraiment direos.listdir
? ls
dans le shell n'est pas adéquate. Le programme doit découvrir lui-même chaque fois que je ou de certains autres dev ajoute un nouveau plugin par l'enregistrement d'un nouveau module (dire new.py) à l'intérieur du plugin sous-paquetage. Le programme affiche une liste de découvert plugins.- Pourquoi vous ne comprenez pas que c'est pertinent, c'est quelque chose que vous ne pouvez pas comprendre. La découverte de ce par programme est sur que le application prend de l'intérêt dans le contenu d'un paquet, pas l'utilisateur.
- Désolé, c'est quelque chose que je ne peux pas comprendre.
- le programme doit découvrir lui-même chaque fois que je ou de certains autres dev ajoute un nouveau plugin" Qu'est ce que cela a à voir avec la question? Quand j'ai lu la question, presque aucun de ces mots apparaissent. Comment est la question à propos de l'étrange affaire de quelqu'un de l'ajout de composants secrètement?
- Est-il possible pour vous expliquer quel est le problème à résoudre? Reconnaissez-vous le "détecter les submodules d'un paquet à l'exécution" du cas d'utilisation?
- Bien sûr, je veux dire par programmation! Sinon, je n'aurais pas mentionné "le déploiement de mon propre solution avec os.listdir()"
Vous devez vous connecter pour publier un commentaire.
Oui, vous voulez quelque chose de basé sur
pkgutil
ou semblables, de cette façon, vous pouvez traiter tous les paquets semblables, peu importe si elles sont dans les œufs ou les fermetures à glissière ou so (où les os.listdir ne va pas aider).Comment les importer trop? Vous pouvez simplement utiliser
__import__
comme d'habitude:importer
retourné parpkgutil.iter_modules
? Puis-je l'utiliser pour importer un module à la place de l'utilisation de ce convenable "hackish"__import__(modname, fromlist="dummy")
?m = importer.find_module(modname).load_module(modname)
et puism
est le module, donc par exemple:m.myfunc()
_path_
). Il devrait y avoir deux de chaque côté, pour un total de quatre (ie__path__
).Le bon outil pour ce travail, c'est pkgutil.walk_packages.
À la liste de tous les modules de votre système:
Être conscient que walk_packages les importations de tous les sous-paquets, mais pas submodules.
Si vous souhaitez la liste de tous les submodules d'un certain paquet, vous pouvez utiliser quelque chose comme ceci:
iter_modules répertorie uniquement les modules qui sont d'un niveau de profondeur.
walk_packages obtient tous les submodules.
Dans le cas de scipy, par exemple, walk_packages retourne
tout iter_modules ne renvoie
La documentation sur pkgutil (http://docs.python.org/library/pkgutil.html)
ne pas la liste de toutes les fonctions intéressantes définis dans
/usr/lib/python2.6/pkgutil.py.
Peut-être cela signifie que les fonctions ne font pas partie du "public" de l'interface et sont soumis à modification.
Cependant, à moins que de la version 2.6 de Python (et peut-être des versions antérieures?)
pkgutil est livré avec un walk_packages méthode qui parcourt récursivement tous les
les modules disponibles.
walk_packages
est maintenant dans la documentation: docs.python.org/library/pkgutil.html#pkgutil.walk_packages_
) avant et aprèspath
-- c'est-à - l'utilisationpackage.__path__
plutôt quepackage._path_
. Il pourrait être plus facile d'essayer de couper & coller le code plutôt que de re-saisir.package
pointant vers un paquet, pas un module. Les Modules sont des fichiers alors que les packages sont des répertoires. Tous les paquets ont la__path__
attribut (... à moins que quelqu'un a supprimé l'attribut pour une raison quelconque.)Cela fonctionne pour moi:
Voici une méthode qui, du haut de ma tête:
Il pourrait certainement être nettoyé et améliorée.
EDIT: Voici une un peu plus sympa version:
REMARQUE: Cela permettra également de trouver des modules qui pourraient ne pas être nécessairement situé dans un sous-répertoire de l'emballage, si ils sont tiré dans son
__init__.py
fichier, donc, cela dépend de ce que tu veux dire par "une partie" d'un paquet.