Comment vérifier submodules en Python avec hasattr
Question
Au moment de l'exécution, le code Python obtient le nom d'un sous-module de charge, dont je ne sais pas avant.Maintenant, je veux vérifier, si ce sous-module existe à l'intérieur d'un module existant.Considérer cette structure, où foo
et bar
peut être spécifié:
master/
|
|- __init__.py
|
|- foo/
| |
| |- __init__.py
|
|- bar/
|
|- __init__.py
Maintenant, j'ai l'habitude de faire ce qui fonctionne pour les defs et variables:
import master
unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
pass # all's well
ou je suis la capture de la AttributeError, qui fonctionne aussi.
Cependant, avec le fichier ci-dessus de la structure, je ne suis pas en mesure d'apporter cette approche et de travail. hasattr()
retourne toujours Faux (c'est, il y a toujours un AttributeError jeté).
Si je regarde dir(master)
, Je vois cette sortie:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
et même spécifiant explicitement __all__
dans master/__init__.py
n'aide pas, mais les changements de la dir() pour
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
Aucune idée, ce que je fais mal ou si il y a une façon de réaliser ces types de tests?(Btw:La version 2.6 de Python sur windows/Cygwin, si c'est de l'intérêt)
La solution
Submodules ne sont pas des attributs de leur parent modules, sauf si mentionné explicitement.Essayez tout simplement d'importer le module et de l'attraper ImportError
:
try:
__import__("os.peth", fromlist=[os])
except ImportError:
pass
Autres conseils
vous pouvez le faire
try:
import module.submodule
except ImportError:
print 'failed or whatever'
J'ai récemment eu à vérifier sous-module existence et depuis que je suis à l'aide de python 3.4.1, je suis en train de donner une nouvelle réponse à la question:
En python 3.4.1 vous pouvez utiliser 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')
Facile =)