如何使用 hasattr 检查 Python 中的子模块
题
在运行时,Python 代码获取要加载的子模块的名称,这是我之前不知道的。现在,我想检查该子模块是否存在于现有模块中。考虑这个结构,其中 foo
和 bar
可以指定:
master/
|
|- __init__.py
|
|- foo/
| |
| |- __init__.py
|
|- bar/
|
|- __init__.py
现在,我通常这样做,这适用于定义和变量:
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,如果有兴趣的话)
解决方案
除非明确说明,子模块不是其父模块的属性。只需尝试导入模块并捕获 ImportError
:
try:
__import__("os.peth", fromlist=[os])
except ImportError:
pass
其他提示
你可以做
try:
import module.submodule
except ImportError:
print 'failed or whatever'
我最近不得不检查子模块是否存在,因为我使用的是 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')
就这么简单 =)
不隶属于 StackOverflow