从同级目录导入

Posted

技术标签:

【中文标题】从同级目录导入【英文标题】:Import from sibling directory 【发布时间】:2011-05-31 08:26:43 【问题描述】:

我有一个名为“ClassA”的 Python 类和另一个应该导入 ClassA 的 Python 类,即“ClassB”。目录结构如下:

MainDir
../Dir
..../DirA/ClassA
..../DirB/ClassB

我将如何使用sys.path 以便 ClassB 可以使用 ClassA?

【问题讨论】:

它被称为相对导入,并且有相当多的 googleable 材料和 SO 问题。 ***.com/questions/279237/… 【参考方案1】:

作为问题“Python 从父目录导入”的字面答案:

导入当前模块父目录中的“mymodule”:

import os
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.sys.path.insert(0,parentdir) 
import mymodule

编辑 不幸的是,__file__ 属性并不总是设置。 获取父目录的更安全的方法是通过检查模块:

import inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)

【讨论】:

Remi - 感谢字面上的回答。在为 python 应用程序编写测试代码时,我发现这很有用。我可以将测试代码放在一个子目录中,并且我可以在不修改现有项目的情况下开始放置测试。 (换句话说,从管理将错误引入工作代码的风险的角度来看,在进行测试之前将现有代码转换为模块将是不正确的操作顺序。)您更改模块路径的方法很方便。 【参考方案2】:

您可以使用relative import(来自链接的示例,当前模块 - A.B.C):

from . import D                 # Imports A.B.D
from .. import E                # Imports A.E
from ..F import G               # Imports A.F.G

【讨论】:

@Yakattak:是的,但无论如何它们都应该放在一个包中;) 这看起来是最好和最简单的答案 警告:相对导入依赖于模块的__name__,所以如果你打算运行当前模块(将__name__设置为__main__),相对导入将失败 将其称为包的标准是什么?只是每个子文件夹都包含一个 init.py? @Sledge 这意味着所有三个 1)将__init__.py放在代码的***目录 2)添加父目录PYTHONPATH 3)将 Python 程序中的 __package__ 变量设置为包含 __init__.py 的目录的名称。【参考方案3】:

你真的应该使用包。然后将 MainDir 放在文件系统中 sys.path 上的某个点(例如 .../site-packages),然后你可以在 ClassB 中说:

from MainDir.Dir.DirA import ClassA # which is actually a module

您只需在每个目录中放置名为__init__.py 的文件,使其成为一个包层次结构。

【讨论】:

我将 MainDir 添加到 sys.path 并尝试了您的解决方案,但它只是说没有名为 MainDir.Dir.DirA 的模块,并且有 init.pys 在所有目录。 不要添加MainDir,添加其父目录。如果您添加 MainDir(如果那不是包根目录,那很好),然后像 from Dir.DirA import ClassA 一样导入。 我花了一段时间才弄明白“把你的代码变成一个包”的意思是全部 1) 把__init__.py放在你的代码的***目录中和 2)将顶层目录的父目录添加到您的PYTHONPATH 3)将Python程序中的__package__变量设置为包含的目录的名称__init__.py。现在一切正常,谢谢! 如果 ClassA.py 代码定义 import ClassAA 其中 ClassAA.py 也在 DirA 中,那么当从 ClassB 导入 ClassA 时,上述方法会失败。在这种情况下正确的方法是什么? @Phoenix 使用相对导入 import .ClassAA,或在 ClassB 中 import ..DirA.ClassAA

以上是关于从同级目录导入的主要内容,如果未能解决你的问题,请参考以下文章

如何从同级目录导入 Python 脚本?

从 Cloud Functions 中的父目录或同级目录导入模块?

pycharm中同级目录不能相互导入使用的解决办法

如何在python3中正确导入同一目录下的模块

Python-import导入上级目录文件

模块整理笔记