父目录中模块的相对导入

Posted

技术标签:

【中文标题】父目录中模块的相对导入【英文标题】:Relative import of module in parent directory 【发布时间】:2021-12-04 17:49:12 【问题描述】:

我希望能够从位于子文件夹中的测试脚本测试 python 类。我的项目结构如下:

importTest
    __init__.py
    testFolder
        testScript.py
    tobeimported.py

tobeimported.py的内容是:

class ToBeImported:
    def __init__(self):
        self.print('Created!')

我的 testScript.py 的内容是:

from ...importTest import tobeimported

def runTest():
    item = tobeimported.ToBeImported()

if __name__ == '__main__':
    runTest()

当我运行 testScript.py 时,我得到了错误:

attempted relative import with no known parent package

但是 importTest 应该被称为一个包,对吧?因为它有__init__.py 文件?

我还能如何在我的测试脚本中导入我的 ToBeImported 类?

我正在运行 python 3.9.5

【问题讨论】:

您可以在您的__init__.py 文件中添加from .tobeimported import ToBeImported 并使用from importTest import ToBeImported @BijayRegmi:不,这不起作用。如果我尝试这个,运行 testScript.py 它会说:'没有名为 importTest 的模块。此外,这意味着__init__.py 必须根据每次导入的使用情况进行更改。从文档中我了解到该文件需要为空... 如何运行脚本? @Mr_and_Mrs_D:很抱歉我的回复晚了...我以 python3 -m importTest/testFolder/testScript.py 运行它。 【参考方案1】:

这里有两个问题

testFolder 中没有 __init__.py 文件,因此就 python 而言,这不是 python 包 testScript.py 直接从其文件夹运行。这使得python认为***包是testFolder所以“没有已知的父包”

您应该添加初始化文件,然后从 importTest 的父文件夹中以python -m importTest.testFolder.testScript 运行代码

【讨论】:

非常感谢!我从来不知道你可以像这样运行包的一部分。这确实有效!

以上是关于父目录中模块的相对导入的主要内容,如果未能解决你的问题,请参考以下文章

SystemError:父模块''未加载,无法执行相对导入[重复]

Python SystemError:父模块''未加载,无法执行相对导入[重复]

如何在python中完成相对导入

不确定我是不是应该使用相对导入或将父目录添加到 sys.path [重复]

使用 Python 3 从另一个目录中的模块导入本地函数,并在 Jupyter Notebook 中进行相对导入

在Python中以绝对路径或者相对路径导入文件(或模块)的方法