如何使用hasattr检查Python中的子模块

时间:2010-07-13 12:55:27

标签: python import module hasattr

在运行时,Python代码获取要加载的子模块的名称,这是我以前不知道的。现在,我想检查一下现有模块中是否存在此子模块。考虑这种结构,可以指定foobar

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

现在,通常我这样做,适用于defs和变量:

import master

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

或者我正在捕捉AttributeError,它同样有用。

但是,使用上述文件结构,我无法使这种方法起作用。 hasattr()始终返回False(即,始终会抛出AttributeError)。

如果我查看dir(master),我会看到此输出:

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

甚至在__all__中明确指定master/__init__.py也无济于事,但将dir()更改为

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

任何想法,我做错了什么,或者是否有办法实现这些类型的测试? (顺便说一句:Win / Cygwin上的Python 2.6,如果有兴趣的话)

3 个答案:

答案 0 :(得分:2)

除非明确说明,否则子模块不是其父模块的属性。只需尝试导入模块并捕获ImportError

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

答案 1 :(得分:1)

你可以做到

try:
 import module.submodule

except ImportError:
  print 'failed or whatever'

答案 2 :(得分:1)

我最近不得不检查子模块的存在,因为我使用的是python 3.4.1,我给出了一个新问题的答案:

在python 3.4.1中,您可以使用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')

那很容易=)