【发布时间】:2013-04-11 02:18:55
【问题描述】:
背景
我有一个具有此目录结构的 Python 项目:
py/:
db/ __init__.py run.py
py/db:
handle.py __init__.py util.py
这些文件很简单,我不确定是否需要发布它们;尽管如此:
py/run.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
如果我从db 子目录中运行handle.py,它会导入util 而不会出错。但是,当我运行 run.py 时,handle.py 失败并出现导入错误。我可以猜测handle.py 正在py 目录中运行(而不是py/db),并在handle.py 中调用os.getcwd() 证实了这一点。我可以像这样使用sys.path 来解决这个问题(在run.py 中):
import sys
sys.path.append("db")
from db.handle import Handle
问题
当从一个子目录导入一个包含对该目录中其他本地模块的导入的模块时,为什么 Python 不检查生成导入语句的模块的当前目录?在我的示例中,当handle.py 包含导入语句时,为什么Python 不首先检查db?是否有 PEP 描述了这一点,还是我错过了具有明显理由的行为?
我认为可能与PEP 328有关:
默认情况下,所有导入语句都是绝对的(仅搜索 sys.path),使用特殊语法(前导点)来访问包相对导入。
但我不确定。
【问题讨论】:
标签: import python-3.x python-import pep