当我在开发环境中运行导入时,我似乎得到了错误的模块。
我如何理解这一点?
$ python -c "import breathe.renderer.rst.doxygen.compound as com; print com"
<module 'breathe.parser.doxygen.compound' from 'breathe/parser/doxygen/compound.pyc'>
呼吸目录的布局是:
breathe
├── directives.py
├── finder
│ ├── doxygen
│ │ ├── base.py
│ │ ├── compound.py
│ │ ├── index.py
│ │ └── __init__.py
│ └── __init__.py
├── __init__.py
├── nodes.py
├── parser
│ ├── doxygen
│ │ ├── compound.py
│ │ ├── compoundsuper.py
│ │ ├── index.py
│ │ ├── indexsuper.py
│ │ ├── __init__.py
│ ├── __init__.py
├── process.py
├── renderer
│ ├── __init__.py
│ └── rst
│ ├── doxygen
│ │ ├── base.py
│ │ ├── compound.py
│ │ ├── domain.py
│ │ ├── filter.py
│ │ ├── index.py
│ │ ├── __init__.py
│ │ └── target.py
│ ├── __init__.py
└── transforms.py
答案 0 :(得分:3)
检查您的breathe/renderer/rst/__init__.py
文件。我怀疑你有像
from breathe.parser import doxygen
当导入模块时,会执行模块的__init__.py
。然后导入下一个子模块并运行__init__.py
。
因此,在上述情况下,您将获得breathe.renderer.rst
导入正常,但在运行时
breathe.renderer.rst.__init__
,breathe.parser.doxygen
模块绑定到覆盖doxygen
子模块的本地名称doxygen
。所以你应该看到这样的东西:
>>> from breathe.renderer import rst
>>> print(rst.doxygen)
<module 'breathe.parser.doxygen' from 'breathe/parser/doxygen/__init__.pyc'>
可能的解决方案:
__init__.py
__init__.py
import
而不是全局。 (这也可以解决循环导入问题)请注意,__init__.py
中没有任何内容禁止代码,stdlib中的几个模块也会这样做。然而,由于这种问题,通常认为避免做太多是个好主意。