奇怪的Python导入问题 - 内部相对进口?

时间:2013-05-15 16:34:19

标签: python import

当你在一个软件包中进行导入时,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为None。但为什么它首先存在?为什么模块列表会在注册时注册一个已经证明不存在的模块?我认为这是因为系统首先在TestFolder中检查“os”库(因此是TestFolder.os),然后在内置函数中查找。为什么只是因为你选中了一个条目?有没有人能够深入了解为什么Python会这样做?也许只是因为它再也不会检查那些位置的库?

1 个答案:

答案 0 :(得分:1)

缓存包括未命中和命中。 TestFolder.os == None只是意味着python寻找一个名为“os”的包相关模块,没有找到它,然后继续行。它缓存包绝对名称“TestFolder.os”,因为这是其他模块所称的。它将值设置为None,以便其他模块的导入不必再次检查文件系统。