在包中导入Python模块会从同一个包中返回不同的模块

时间:2013-12-06 04:06:05

标签: python import

当我在开发环境中运行导入时,我似乎得到了错误的模块。

我如何理解这一点?

$ 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

1 个答案:

答案 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'>

可能的解决方案:

  1. __init__.py
  2. 中使用绝对导入
  3. 尽可能多地保留__init__.py
  4. 之外的代码
  5. 在需要的功能中使用import而不是全局。 (这也可以解决循环导入问题)
  6. 请注意,__init__.py中没有任何内容禁止代码,stdlib中的几个模块也会这样做。然而,由于这种问题,通常认为避免做太多是个好主意。