我有一个具有此目录结构的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),使用特殊语法(前导点)来访问与包相关的导入。
但我不确定。
答案 0 :(得分:1)
您的导入是“绝对的”,并且在PYTHONPATH中查找模块名称,并且通常包括当前目录。
如果要从模块所在的同一文件夹导入模块,请使用相对导入:
from . import util
或
from .util import addtwo