¿Existe una manera directa de listar los nombres de todos los módulos en un paquete, sin usar __all__
?¿Hay una forma estándar de enumerar los nombres de los módulos de Python en un paquete?
Por ejemplo, dado este paquete:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Me pregunto si hay una manera estándar o incorporada a hacer algo como esto:
>>> package_contents("testpkg")
['modulea', 'moduleb']
El enfoque manual sería iterar a través de las rutas de búsqueda del módulo para encontrar el directorio del paquete. Uno podría enumerar todos los archivos en ese directorio, filtrar los archivos de nombre único py/pyc/pyo, quitar las extensiones y devolver esa lista. Pero esto parece una buena cantidad de trabajo para algo que el mecanismo de importación de módulos ya está haciendo internamente. ¿Esa funcionalidad está expuesta en cualquier lugar?
Agregaría 'y module! = "__init__.py"' a la final 'if', ya que __init__.py no es realmente parte del paquete. Y .pyo es otra extensión válida. Aparte de eso, usar imp.find_module es una muy buena idea; Creo que esta es la respuesta correcta. – DNS
No estoy de acuerdo, puede importar __init__ directamente, entonces ¿por qué es tan especial? Seguro que no es lo suficientemente especial como para romper las reglas. ;-) – cdleary
Probablemente deberías usar 'imp.get_suffixes()' en lugar de tu lista escrita a mano. – itsadok