背景
我有一个具有此目录结构的 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.py
从db
子目录中运行,它会毫无错误地导入util
。但是,当我运行时run.py
,handle.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),使用特殊语法(前导点)来访问包相对导入。
但我不确定。