137 votes

Existe-t-il une méthode standard pour répertorier les noms des modules Python dans un package?

Est-il un moyen simple d'énumérer les noms de tous les modules dans un colis, sans l'aide d' __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ù?

239voto

jp. Points 781

En utilisant python2.3 et supérieur , vous pouvez également utiliser le module pkgutil :

 >>> import pkgutil
>>> [name for _, name, _ in pkgutil.iter_modules(['testpkg'])]
['modulea', 'moduleb']
 

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:

 >>> import os.path, pkgutil
>>> import testpkg
>>> pkgpath = os.path.dirname(testpkg.__file__)
>>> print [name for _, name, _ in pkgutil.iter_modules([pkgpath])]
 

53voto

Triptych Points 70247
import module
help(module)

24voto

cdleary Points 18869

Peut-être que cela fera ce que vous cherchez?

 import imp
import os
MODULE_EXTENSIONS = ('.py', '.pyc', '.pyo')

def package_contents(package_name):
    file, pathname, description = imp.find_module(package_name)
    if file:
        raise ImportError('Not a package: %r', package_name)
    # Use a set because some may be both source and compiled.
    return set([os.path.splitext(module)[0]
        for module in os.listdir(pathname)
        if module.endswith(MODULE_EXTENSIONS)])
 

18voto

siebz0r Points 3960

Je ne sais pas si je néglige quelque chose ou si les réponses sont simplement obsolètes, mais

Comme indiqué par l'utilisateur815423426, cela ne fonctionne que pour les objets dynamiques et les modules répertoriés ne sont que des modules importés auparavant.

La liste des modules dans un paquet semble vraiment facile en utilisant inspect :

 >>> import inspect, testpkg
>>> inspect.getmembers(testpkg, inspect.ismodule)
['modulea', 'moduleb']
 

-3voto

QueueHammer Points 2492

print dir (module)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X