todas programacion módulo modulos librerias libreria las importar importa descargar cuando contenido clases python module packages introspection python-import

programacion - ¿Enumera todos los módulos que son parte de un paquete python?



programacion modular en python (4)

Aquí hay una forma, fuera de mi cabeza:

>>> import os >>> filter(lambda i: type(i) == type(os), [getattr(os, j) for j in dir(os)]) [<module ''UserDict'' from ''/usr/lib/python2.5/UserDict.pyc''>, <module ''copy_reg'' from ''/usr/lib/python2.5/copy_reg.pyc''>, <module ''errno'' (built-in)>, <module ''posixpath'' from ''/usr/lib/python2.5/posixpath.pyc''>, <module ''sys'' (built-in)>]

Sin duda podría ser limpiado y mejorado.

EDITAR: Aquí hay una versión un poco más agradable:

>>> [m[1] for m in filter(lambda a: type(a[1]) == type(os), os.__dict__.items())] [<module ''copy_reg'' from ''/usr/lib/python2.5/copy_reg.pyc''>, <module ''UserDict'' from ''/usr/lib/python2.5/UserDict.pyc''>, <module ''posixpath'' from ''/usr/lib/python2.5/posixpath.pyc''>, <module ''errno'' (built-in)>, <module ''sys'' (built-in)>] >>> [m[0] for m in filter(lambda a: type(a[1]) == type(os), os.__dict__.items())] [''_copy_reg'', ''UserDict'', ''path'', ''errno'', ''sys'']

NOTA: Esto también encontrará módulos que pueden no estar ubicados necesariamente en un subdirectorio del paquete, si están __init__.py en su archivo __init__.py , por lo que depende de lo que quiere decir con "parte de" un paquete.

¿Existe una forma directa de encontrar todos los módulos que forman parte de un paquete python? Encontré esta vieja discusión , que no es realmente concluyente, pero me gustaría tener una respuesta definitiva antes de lanzar mi propia solución basada en os.listdir ().


Esto funciona para mí:

import types for key, obj in nltk.__dict__.iteritems(): if type(obj) is types.ModuleType: print key


La herramienta adecuada para este trabajo es pkgutil.walk_packages.

Para enumerar todos los módulos en su sistema:

import pkgutil for importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None): print(modname)

Tenga en cuenta que walk_packages importa todos los subpaquetes, pero no los submódulos.

Si desea enumerar todos los submódulos de un determinado paquete, puede usar algo como esto:

import pkgutil import scipy package=scipy for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__, prefix=package.__name__+''.'', onerror=lambda x: None): print(modname)

iter_modules solo enumera los módulos que tienen un nivel de profundidad. walk_packages obtiene todos los submódulos. En el caso de scipy, por ejemplo, devuelve walk_packages

scipy.stats.stats

mientras que iter_modules solo regresa

scipy.stats

La documentación en pkgutil ( http://docs.python.org/library/pkgutil.html ) no enumera todas las funciones interesantes definidas en /usr/lib/python2.6/pkgutil.py.

Quizás esto significa que las funciones no son parte de la interfaz "pública" y están sujetas a cambios.

Sin embargo, al menos desde Python 2.6 (¿y quizás versiones anteriores?), Pkgutil viene con un método walk_packages que recorre recursivamente todos los módulos disponibles.


Sí, quiere algo basado en pkgutil o similar, de esta forma puede tratar todos los paquetes independientemente de si están en huecos o en cremallera (donde os.listdir no ayudará).

import pkgutil # this is the package we are inspecting -- for example ''email'' from stdlib import email package = email for importer, modname, ispkg in pkgutil.iter_modules(package.__path__): print "Found submodule %s (is a package: %s)" % (modname, ispkg)

¿Cómo importarlos también? Puedes usar __import__ como siempre:

import pkgutil # this is the package we are inspecting -- for example ''email'' from stdlib import email package = email prefix = package.__name__ + "." for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix): print "Found submodule %s (is a package: %s)" % (modname, ispkg) module = __import__(modname, fromlist="dummy") print "Imported", module