为什么从当前目录中的模块导入仅在该目录中有效?

时间:2013-04-11 02:18:55

标签: import python-3.x python-import pep

背景

我有一个具有此目录结构的Python项目:

py/:
db/  __init__.py  run.py

py/db:
handle.py  __init__.py  util.py

文件很简单,我不确定是否需要发布它们;尽管如此:

PY / run.py

from db.handle import Handle

PY /分贝/ handle.py

import util

class Handle:
    def __init__(self, x):
        self.x = util.addtwo(x)

PY /分贝/ util.py

def addtwo(x):
    return x + 2

如果我从handle.py子目录中运行db,它会毫无错误地导入util。但是,当我运行run.py时,handle.py因导入错误而失败。我可以猜测handle.py正在py目录中运行{而不是py/db),而os.getcwd()中的handle.py来电确认了这一点。我可以使用sys.path来解决此问题(如run.py):

import sys
sys.path.append("db")
from db.handle import Handle

问题

从子目录导入包含导入到该目录中其他本地模块的模块时,为什么Python不检查进行导入语句的模块的当前目录?在我的示例中,为什么当db包含import语句时,Python不会首先检查handle.py?是否有一个描述这个的PEP或者是一个我错过了明显的理由的行为?

我认为它可能与PEP 328

有关
  

默认情况下,所有import语句都是绝对的(仅搜索sys.path),使用特殊语法(前导点)来访问与包相关的导入。

但我不确定。

1 个答案:

答案 0 :(得分:1)

您的导入是“绝对的”,并且在PYTHONPATH中查找模块名称,并且通常包括当前目录。

如果要从模块所在的同一文件夹导入模块,请使用相对导入:

from . import util

from .util import addtwo