导入没有看到包中的模块,两个导入之间不一致

时间:2013-12-02 22:05:43

标签: python import

在我正在处理的一些代码中导入模块时遇到了一个奇怪的问题。目录布局是:

main.py
cm1sinit/
   __init__.py
   MainInterface.py
   soundings/
      __init__.py
      WK82.py
   hodographs/
      __init__.py
      curved90.py
在所有情况下,

__ init__.py都是一个0长的空文件。

在MainInterface.py中,我有以下导入:

import soundings
import hodographs

并在每个上面调用dir()或inspect.getmembers():

dir(soundings)
['WK82', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

dir(hodographs)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

为什么声音输入拾取其模块WK82而hodographs导入没有拾取弯曲90?我正在尝试动态生成仅通过向模块目录添加文件来填充的pyQt小部件。这适用于发声模块,但不适用于hodographs。

我可以通过使用:

来解决这个问题
import hodographs.curved90
dir(hodographs)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'curved90']

但这违背了我不必在动态内容生成中明确命名导入的目的。

如何解决这个问题,以便'导入hodographs'正确导入该目录中的所有文件?

1 个答案:

答案 0 :(得分:1)

导入包时,只会初始化和导入包(即__init__.py中定义的包) - 包中包含的子包和模块不会自动导入。

为此,您需要编辑__init__.py个文件,使其如下所示:

# cms1init/soundings/__init__.py
from cms1init.soundings import WK82

这样,WK82模块就会被导入并作为cms1init.soundings的属性使用。只需重复cms1init.hodographs包的操作。

这有意义吗?