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)

Était-ce utile?

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 =)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top