导入疯狂:使用绝对导入不起作用

时间:2016-08-08 10:34:40

标签: python-2.7 import packages

最近,我正在开发一个项目,在那里我有一个沙盒,我正在开发我的应用程序的一部分。我们的想法是开发沙盒中的所有功能,并在测试之后将其移动到正确的项目包中。 Please, do not discuss this approach, the main case is the import problem, not the work organisation.

使用这种方法,我得到了沙箱的这种结构:

sandbox
  |
  +- importer
      |
      +-- __init__.py       
      +-- ca
           |
           +-- __init__.py
           +-- ca.py
           +-- zombie.py

文件内容:

  • importer/__init__.py

    import importer.ca
    
  • importer/ca/__init__.py

    from ca import *
    
  • importer/ca/ca.py

    import importer.ca.zombie as zombie
    

所有其他文件都是空的。

运行python interpreter后:

>>> import importer
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "importer\__init__.py", line 1, in <module>
    import importer.ca
  File "importer\ca\__init__.py", line 1, in <module>
    from ca import *
  File "importer\ca\ca.py", line 2, in <module>
    import importer.ca.zombie as zombie
AttributeError: 'module' object has no attribute 'ca'

我的sys.path中有一个沙盒目录。

当我删除importer/ca/ca.py的内容时,我可以导入导入程序。 此外,当我将importer/ca/ca.py的内容更改为import importer.ca.zombieimport zombiefrom importer.ca import zombie时,一切正常。 更进一步,使用其中一个实际工作的选项,然后我打印出我的模块缓存:

>>> import sys
>>> for i in sorted(sys.modules.keys()): print i

我明白了:

...
errno
exceptions
functools
genericpath
importer
importer.ca
importer.ca.ca
importer.ca.importer
importer.ca.zombie
importer.importer
linecache
locale
nt
...

importer.ca.importerimporter.importer是Nones。那实际上是怎么去的?

因此,总而言之,我的问题不是如何使其工作,而是为什么它以这种方式工作。为什么我不能使用绝对导入路径import importer.ca.zombie as zombie以及sys.module缓存中发生了什么?

0 个答案:

没有答案