从兄弟目录导入

42 投票
3 回答
55465 浏览
提问于 2025-04-16 09:06

我有一个叫做“ClassA”的Python类,还有另一个Python类“ClassB”,它需要引入ClassA。它们的文件夹结构如下:

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

我该如何使用 sys.path 让ClassB能够使用ClassA呢?

3 个回答

31

你可以使用相对导入(这个例子来自链接,当前模块是A.B.C):

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

作为对问题“如何从父目录导入Python模块”的直接回答:

如果你想导入在当前模块的父目录中的“mymodule”,可以这样做:

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

补充说明 不幸的是,__file__ 属性并不总是可用。 更安全的获取父目录的方法是使用 inspect 模块:

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

你真的应该使用包。这样,MainDir就会放在文件系统中的一个位置,比如说.../site-packages,然后在ClassB里你可以这样写:

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

你只需要在每个目录里放一个叫做__init__.py的文件,这样就能形成一个包的层级结构。

撰写回答