0

背景

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

py/:
db/  __init__.py  run.py

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

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

py/运行.py

from db.handle import Handle

py/db/handle.py

import util

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

py/db/util.py

def addtwo(x):
    return x + 2

如果我handle.pydb子目录中运行,它会毫无错误地导入util。但是,当我运行时run.pyhandle.py由于导入错误而失败。我可以猜到它handle.py正在py目录中运行(而不是py/db),并且调用os.getcwd()in可以handle.py确认这一点。我可以sys.path像这样(在run.py)解决这个问题:

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

问题

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

我认为它可能与PEP 328有关:

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

但我不确定。

4

1 回答 1

1

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

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

from . import util

或者

from .util import addtwo
于 2013-04-11T04:32:45.227 回答