0

在运行时,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__inmaster/__init__.py也无济于事,而是将 dir() 更改为

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

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

4

3 回答 3

2

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

try:
    __import__("os.peth", fromlist=[os])
except ImportError:
    pass
于 2010-07-13T13:04:41.827 回答
2

我最近不得不检查子模块的存在,因为我使用的是 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')

很简单=)

于 2014-05-29T00:18:16.923 回答
1

你可以做

try:
 import module.submodule

except ImportError:
  print 'failed or whatever'
于 2010-07-13T13:03:41.203 回答