Est-il un standard moyen de la liste de noms de modules Python dans un paquet?
Est-il un moyen simple d'énumérer les noms de tous les modules dans un colis, sans l'aide de __all__
?
Par exemple, compte tenu de ce package:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Je me demandais si il existe une norme ou intégré dans la façon de faire quelque chose comme ceci:
>>> package_contents("testpkg")
['modulea', 'moduleb']
Le manuel d'approche serait de parcourir le module de chemins de recherche afin de trouver le paquet du répertoire. On pourrait alors la liste de tous les fichiers dans ce répertoire, filtre l'unique nommé py/pyc/pyo fichiers, bande les extensions, et le retour de cette liste. Mais cela semble être une bonne quantité de travail pour quelque chose, le module d'importation mécanisme est déjà en interne. Est-ce que la fonctionnalité exposés n'importe où?
Vous devez vous connecter pour publier un commentaire.
Peut-être que cela va faire ce que vous recherchez?
imp.get_suffixes()
au lieu de votre liste.xml.sax
[os.path.splitext(module)[0]
? Tout d'abord, le module n'est pas défini... voulez-vous dire 'package_name" ou "chemin" (dont près que je peux dire, sont toujours les mêmes), et puis pourquoi tranche de l'extension d'un nom de package? Y aurait-il un? Et d'ailleurs, pourquoi inclure le package à tous?.py$class
fichiers dans un .fichier jarÀ l'aide de python2.3 et au-dessus, vous pouvez également utiliser la
pkgutil
module:EDIT: Notez que le paramètre n'est pas une liste de modules, mais une liste de chemins d'accès, de sorte que vous pouvez faire quelque chose comme ceci:
pkgutil
il y a dans les python2.3 en fait. Aussi, tandis quepkgutil.iter_modules()
ne fonctionnera pas de manière récursive, il y a unpkgutil.walk_packages()
ainsi, qui est de manière récursive. Merci pour le pointeur vers ce paquet bien.iter_modules
ne fonctionne pas pour absolue à l'importation commea.b.testpkg
? Il me donne[]
os.path.dirname
, mais encore une fois, je pense que cela fonctionnera avec ou sans elle, car testpkg est un répertoire.pkgutil.walk_packages()
se répète, il me donne le même résultat quepkgutil.iter_modules()
, donc je pense que la réponse est incomplète.os.path
comme un sous-module deos
. Mais c'est peut-être un cas particulier?help()
œuvres. De toute façon, le haut-pydoc
module peut aider à cracher de la chaînehelp()
pagine:import pydoc; pydoc.render_doc('mypackage')
.Ne sais pas si je suis donnant sur quelque chose, ou si les réponses sont tout simplement hors-daté mais;Comme l'a déclaré user815423426 cela fonctionne uniquement pour les objets vivants et les modules sont uniquement les modules qui ont été importés avant.
Liste des modules dans un paquet semble vraiment facile à l'aide de inspecter:
imported = import importlib; importlib.import_module('myproj.mymod.mysubmod')
.__import__
importations de haut niveau module, voir la documentation.import inspect, mypackage
et puisinspect.getmembers(my_package, inspect.ismodule)
- je obtenir une liste vide, même si je n'ai certainement différents modules en elle.import my_package.foo
et pas seulementimport mypackage
, auquel cas il renvoie ensuitefoo
. Mais cela va à l'encontre du butinspect
, il dit explicitement qu'il est une librairie d'inspecter objets en direct, qui est pourquoi il ne montre pas tout ce qui n'a pas encore été chargé.C'est un appel récursif à la version qui fonctionne avec python 3.6 et ci-dessus:
os.scandir
comme un gestionnaire de contexte au lieu d'itérer sur le résultat directement des entrées?close
est appelé lorsque vous avez fini avec elle pour s'assurer que tous les détenus les ressources sont libérées.re
au lieu de cela il répertorie chaque paquet, mais ajoutere.
à tousCe doit indiquer la liste des modules:
Si vous souhaitez afficher une inforamtion sur votre colis à l'extérieur du code python (à partir d'une invite de commande), vous pouvez utiliser pydoc pour elle.
Vous aurez le même résultat que pydoc mais à l'intérieur de l'interprète à l'aide de
Basé sur cdleary l'exemple, voici une version récursive d'inscription chemin pour tous les submodules:
isc_datasources
?print dir(module)
logging
paquet pour voir ce que je veux dire. La journalisation contient deux modules: gestionnaires et config. Votre code, vous obtiendrez une liste de 66 éléments, qui ne comprend pas ces deux noms.