最近,我正在开发一个项目,在那里我有一个沙盒,我正在开发我的应用程序的一部分。我们的想法是开发沙盒中的所有功能,并在测试之后将其移动到正确的项目包中。
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.zombie
或import zombie
或from 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.importer
和importer.importer
是Nones。那实际上是怎么去的?
因此,总而言之,我的问题不是如何使其工作,而是为什么它以这种方式工作。为什么我不能使用绝对导入路径import importer.ca.zombie as zombie
以及sys.module
缓存中发生了什么?