Existe-t-il un moyen simple de lister les noms de tous les modules d'un package, sans utiliser __all__
?
Par exemple, étant donné ce package:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Je me demande s'il existe un moyen standard ou intégré de faire quelque chose comme ceci:
>>> package_contents("testpkg")
['modulea', 'moduleb']
L'approche manuelle consisterait à parcourir les chemins de recherche du module afin de trouver le répertoire du paquet. On pourrait alors lister tous les fichiers dans ce répertoire, filtrer les fichiers py / pyc / pyo de nom unique, supprimer les extensions et renvoyer cette liste. Mais cela semble être un travail considérable pour quelque chose que le mécanisme d'importation de modules fait déjà en interne. Cette fonctionnalité est-elle exposée quelque part?
imp.get_suffixes()
place de votre liste manuscrite.xml.sax
En utilisant python2.3 et supérieur , vous pouvez également utiliser le
pkgutil
module:EDIT: Notez que le paramètre n'est pas une liste de modules, mais une liste de chemins, vous voudrez peut-être faire quelque chose comme ceci:
la source
pkgutil
existe en python2.3 et plus en fait . De plus, même sipkgutil.iter_modules()
cela ne fonctionnera pas de manière récursive, il existe également un systèmepkgutil.walk_packages()
qui se répètera. Merci pour le pointeur vers ce package.iter_modules
ne fonctionne pas pour l'importation absolue commea.b.testpkg
? It is give me[]
pkgutil.walk_packages()
répète, cela me donne le même résultat quepkgutil.iter_modules()
, donc je pense que la réponse est incomplète.la source
help()
imprime des trucs, il ne renvoie pas de chaîne.help()
fonctionne. Quoi qu'il en soit, le haut-pydoc
module peut cracher aider la chaînehelp()
pagine:import pydoc; pydoc.render_doc('mypackage')
.Je ne sais pas si j'oublie quelque chose, ou si les réponses sont simplement dépassées mais;Comme indiqué par user815423426, cela ne fonctionne que pour les objets en direct et les modules répertoriés ne sont que des modules qui ont été importés auparavant.
Lister des modules dans un package semble très simple en utilisant inspect :
la source
imported = import importlib; importlib.import_module('myproj.mymod.mysubmod')
.__import__
importe le module de niveau supérieur, voir la documentation .import inspect, mypackage
et puisinspect.getmembers(my_package, inspect.ismodule)
j'obtiens une liste vide, même si j'ai certainement plusieurs modules dedans.import my_package.foo
et pas seulementimport mypackage
, auquel cas il revient ensuitefoo
. Mais cela va à l'encontre du butIl s'agit d'une version récursive qui fonctionne avec python 3.6 et supérieur:
la source
os.scandir
comme gestionnaire de contexte au lieu d'itérer directement les entrées de résultat?close
est appelé lorsque vous en avez terminé pour vous assurer que toutes les ressources détenues sont libérées.re
place, il répertorie tous les paquets mais les ajoutere.
à tousBasé sur l'exemple de cdleary, voici un chemin d'accès de liste des versions récursives pour tous les sous-modules:
la source
Cela devrait lister les modules:
la source
Si vous souhaitez afficher des informations sur votre package en dehors du code python (à partir d'une invite de commande), vous pouvez utiliser pydoc pour cela.
Vous aurez le même résultat que pydoc mais à l'intérieur de l'interpréteur en utilisant l'aide
la source
la source
logging
package de Python pour voir ce que je veux dire. La journalisation contient deux modules: handlers et config. Votre code renverra une liste de 66 éléments, qui n'inclut pas ces deux noms.rép d'impression (module)
la source