【问题标题】:Why does importing from a module from the current directory only work when within that directory?为什么从当前目录中的模块导入仅在该目录中有效?
【发布时间】: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


    【解决方案1】:

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

    如果你想从你的模块所在的同一个文件夹中导入一个模块,你可以使用相对导入:

    from . import util
    

    from .util import addtwo
    

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2012-12-22
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多