¿Existe una forma sencilla de encontrar todos los módulos que forman parte de un paquete de Python? Encontré esta vieja discusión , que no es realmente concluyente, pero me encantaría tener una respuesta definitiva antes de implementar mi propia solución basada en os.listdir ().
python
module
packages
introspection
python-import
static_rtti
fuente
fuente
Respuestas:
Sí, desea algo basado en
pkgutil
o similar; de esta manera, puede tratar todos los paquetes por igual, independientemente de si están en huevos o cremalleras o algo así (donde os.listdir no ayudará).¿Cómo importarlos también? Puedes usarlo
__import__
como de costumbre:fuente
importer
devuelve estopkgutil.iter_modules
? ¿Puedo usarlo para importar un módulo en lugar de usar este aparentemente "truco"__import__(modname, fromlist="dummy")
?m = importer.find_module(modname).load_module(modname)
y luegom
está el módulo, por ejemplo:m.myfunc()
_path_
). Debe haber dos a cada lado, para un total de cuatro (es decir__path__
).La herramienta adecuada para este trabajo es pkgutil.walk_packages.
Para enumerar todos los módulos de su sistema:
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:
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, walk_packages devuelve
mientras que iter_modules solo devuelve
La documentación sobre 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 signifique que las funciones no son parte de la interfaz "pública" y están sujetas a cambios.
Sin embargo, al menos a partir de Python 2.6 (¿y quizás versiones anteriores?) Pkgutil viene con un método walk_packages que recorre recursivamente todos los módulos disponibles.
fuente
walk_packages
está ahora en la documentación: docs.python.org/library/pkgutil.html#pkgutil.walk_packages_
) antes y despuéspath
, es decir, use enpackage.__path__
lugar depackage._path_
. Puede ser más fácil intentar cortar y pegar el código en lugar de volver a escribirlo.package
apunte a un paquete, no a un módulo. Los módulos son archivos, mientras que los paquetes son directorios. Todos los paquetes tienen el__path__
atributo (... a menos que alguien ha eliminado el atributo por alguna razón.)Esto funciona para mi:
fuente
Estaba buscando una forma de recargar todos los submódulos que estoy editando en vivo en mi paquete. Es una combinación de las respuestas / comentarios anteriores, así que decidí publicarlo aquí como una respuesta en lugar de un comentario.
fuente
Aquí hay una forma, fuera de mi cabeza:
Sin duda, podría limpiarse y mejorarse.
EDITAR: Aquí hay una versión un poco mejor:
NOTA: Esto también encontrará módulos que pueden no estar necesariamente ubicados en un subdirectorio del paquete, si están incluidos en su
__init__.py
archivo, por lo que depende de lo que usted quiera decir con "parte de" un paquete.fuente