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

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

就这么简单 =)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top