从兄弟目录导入

sky*_*erl 32 python directory path parent sys

我有一个名为"ClassA"的Python类和另一个应该导入ClassA的Python类,它是"ClassB".目录结构如下:

MainDir
../Dir
..../DirA/ClassA
..../DirB/ClassB
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*emi 47

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

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

import os
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.sys.path.insert(0,parentdir) 
import mymodule
Run Code Online (Sandbox Code Playgroud)

编辑 不幸的是,__file__并不总是设置该属性.获取parentdir的更安全方法是通过inspect模块:

import inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
Run Code Online (Sandbox Code Playgroud)


小智 25

您可以使用相对导入(例如来自链接,当前模块 - A.B.C):

from . import D                 # Imports A.B.D
from .. import E                # Imports A.E
from ..F import G               # Imports A.F.G
Run Code Online (Sandbox Code Playgroud)

  • 这不仅仅适用于包装中吗? (6认同)
  • @Yakattak:是的,但无论如何他们应该在一个包中;) (4认同)
  • 注意:相对导入依赖于模块的“ __name__”,因此,如果您打算运行当前模块(将“ __name__”设置为“ __main__”),则相对导入将失败 (2认同)

Kei*_*ith 17

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

from MainDir.Dir.DirA import ClassA # which is actually a module
Run Code Online (Sandbox Code Playgroud)

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

  • 不要添加MainDir,添加其父目录.如果你添加MainDir(如果那不是包根,那很好),那么导入就像`来自Dir.DirA import ClassA`. (3认同)