Pregunta

En tiempo de ejecución, el código de Python obtiene el nombre de un submódulo de carga, que no sé antes.Ahora, quiero ver, si este submódulo existe en el interior de un módulo existente.Considerar esta estructura, donde foo y bar se puede especificar:

master/
|
|- __init__.py
|
|- foo/
|  |
|  |- __init__.py
|
|- bar/
   |
   |- __init__.py

Ahora, normalmente hago esto, que trabaja para defs y variables:

import master

unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
    pass # all's well

o me estoy poniendo la AttributeError, que funciona igualmente.

Sin embargo, con lo anterior, la estructura del archivo, no soy capaz de llevar este enfoque y de trabajo. hasattr() devuelve siempre False (es decir, siempre hay un AttributeError tirado).

Si miro dir(master), Veo esta salida:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

e incluso especificar explícitamente __all__ en master/__init__.py no ayuda, pero los cambios de la dir() a

['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

Cualquier idea, ¿qué estoy haciendo mal, o si hay una manera de lograr este tipo de pruebas?(Por cierto:Python 2.6 en Ganar/Cygwin, si que es de interés)

¿Fue útil?

Solución

Submódulos, no son atributos de su padre módulos a menos que se indique explícitamente.Simplemente tratar de importar el módulo y captura ImportError:

try:
    __import__("os.peth", fromlist=[os])
except ImportError:
    pass

Otros consejos

usted puede hacer

try:
 import module.submodule

except ImportError:
  print 'failed or whatever'

Hace poco he tenido que comprobar submódulo existencia y ya estoy usando python 3.4.1, me voy a dar una nueva respuesta a la pregunta:

En python 3.4.1 puede utilizar importlib.util.find_spec(name, package=None) (https://docs.python.org/3.4/library/importlib.html#importlib.util.find_spec)

import importlib
module_exists = importlib.util.find_spec('path.to.my.module')

Que fácil =)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top