在运行时,Python代码获取要加载的子模块的名称,这是我以前不知道的。现在,我想检查一下现有模块中是否存在此子模块。考虑这种结构,可以指定foo
和bar
:
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,如果有兴趣的话)
答案 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')
那很容易=)