¿Existe una forma sencilla de enumerar los nombres de todos los módulos en un paquete, sin usar __all__
?
Por ejemplo, dado este paquete:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Me pregunto si hay una forma estándar o incorporada de 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. Luego, uno podría enumerar todos los archivos en ese directorio, filtrar los archivos py / pyc / pyo con nombre exclusivo, eliminar 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 algún lugar?
imp.get_suffixes()
lugar de su lista escrita a mano.xml.sax
Usando python2.3 y superior , también puede usar el
pkgutil
módulo:EDITAR: Tenga en cuenta que el parámetro no es una lista de módulos, sino una lista de rutas, por lo que es posible que desee hacer algo como esto:
fuente
pkgutil
¿Existe en python2.3 y en realidad ? Además, aunquepkgutil.iter_modules()
no funcionará de forma recursiva, también hay unapkgutil.walk_packages()
, que se repetirá . Sin embargo, gracias por el puntero a este paquete.iter_modules
Por qué no funciona para la importación absoluta comoa.b.testpkg
? Me está dando[]
pkgutil.walk_packages()
repita, me da el mismo resultado quepkgutil.iter_modules()
, así que creo que la respuesta está incompleta.fuente
help()
imprime cosas, no devuelve una cadena.help()
funciona. De todos modos, la incorporada en elpydoc
módulo puede ayudar a escupir la cadena quehelp()
pagina:import pydoc; pydoc.render_doc('mypackage')
.No sé si estoy pasando por alto algo, o si las respuestas están desactualizadas, pero;Como dijo el usuario 815423426, esto solo funciona para objetos en vivo y los módulos enumerados son solo módulos que se importaron antes.
Enumerar módulos en un paquete parece realmente fácil usando inspeccionar :
fuente
imported = import importlib; importlib.import_module('myproj.mymod.mysubmod')
.__import__
importa el módulo de nivel superior, consulte la documentación .import inspect, mypackage
y luegoinspect.getmembers(my_package, inspect.ismodule)
obtengo una lista vacía, aunque ciertamente tengo varios módulos en ella.import my_package.foo
y no soloimport mypackage
, en cuyo caso regresafoo
. Pero esto anula el propósitoEsta es una versión recursiva que funciona con python 3.6 y superior:
fuente
os.scandir
como administrador de contexto en lugar de iterar sobre las entradas de resultados directamente?close
se llame cuando haya terminado con él para asegurarse de que se liberen los recursos retenidos.re
cambio, enumera todos los paquetes, pero los agregare.
a todosBasado en el ejemplo de cdleary, aquí hay una ruta de lista de versiones recursivas para todos los submódulos:
fuente
Esto debería enumerar los módulos:
fuente
Si desea ver una información sobre su paquete fuera del código de Python (desde un símbolo del sistema), puede usar Pydoc para ello.
Tendrá el mismo resultado que pydoc pero dentro del intérprete usando ayuda
fuente
fuente
logging
paquete de Python para ver a qué me refiero. El registro contiene dos módulos: controladores y configuración. Su código devolverá una lista de 66 elementos, que no incluye esos dos nombres.imprimir dir (módulo)
fuente