从父文件夹子文件夹相对导入模块

Posted

技术标签:

【中文标题】从父文件夹子文件夹相对导入模块【英文标题】:Relative importing modules from parent folder subfolder 【发布时间】:2012-12-13 00:11:14 【问题描述】:

给定这样的目录结构

main/
    common/
        foo.py
    A/
        src/
            bar.py

如何使用 Python 的相对导入bar 导入foo?通过将其添加到路径中,我得到了一个可行的解决方案,但这很难看。有没有办法在 Python 2.7 中简单地使用单个 import

这是这个问题的一个更复杂的版本:

Importing modules from parent folder

【问题讨论】:

【参考方案1】:

正确的相对导入应该是这样的:

from ...common import foo

但是,相对导入仅适用于一个包。如果main 是一个包,那么你可以在这里使用相对导入。如果main 不是包,则不能。

因此,如果您在/main/ 中运行脚本并执行import A.src.bar 之类的操作,则相对导入将失败,并显示“尝试相对导入超出***包”。这是因为相对导入试图导入***包A之外的东西。

但是,如果您在/ 中运行脚本并执行import main.A.src.bar 之类的操作,那么相对导入将成功,因为main 现在是一个包。在这种情况下,以下两个将是等效的:

from ...common import foo
from main.common import foo

回答您的评论:. 的含义不会根据脚本的运行位置而改变,它会根据包结构的不同而改变。

【讨论】:

那么,您所说的第一种情况的解决方案是什么?

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

从父目录中的 python 模块导入到子目录中的 jupyter notebook 文件中

模块导入循环导入模块查找顺序相对导入及绝对导入

模块之相对路径导入

第十七节:模块的导入总结

Python 包内的导入问题(绝对导入和相对导入)

1.模块2.循环导入问题及解决思路3.区分py文件的两种类型4.模块的查找顺序5.模块的绝对导入与相对导入6.项目开发的目录规范