当您查看 Python 2.7 以在包中导入时,它做了一些非常特殊的事情。基本上,由于我真的无法理解的原因,它存储了内置插件的相对导入(除其他外)。最小用例如下。
假设以下形式的目录结构:
\BaseFolder
* __init__.py
* MainFile.py
\TestFolder
* __init__.py
* TestModule.py
两个 __init__.py 都是空的。MainFile.py 只说:
import TestFolder.TestModule
import sys
for x in sorted(sys.modules.keys()):
print x
TestModule.py 说:
import os
使用 Python 运行 MainFile.py 会为您提供导入模块的列表。当您查看模块的键时,会发现一堆垃圾,但您可以找到以下键:
TestFolder
TestFolder.TestModule
TestFolder.os
...
os
如果您查看这些模块的值,TestFolder.os 为无。但为什么它首先存在呢?为什么模块列表会注册一个在查找时已被证明不存在的模块?我假设发生这种情况是因为系统首先在 TestFolder 中检查“os”库(因此是 TestFolder.os),然后在内置程序中查找。为什么仅仅因为你检查了就添加一个条目?有谁知道为什么 Python 会这样做?也许只是因为它不再检查这些位置的库?