从兄弟目录导入
我有一个叫做“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
的文件,这样就能形成一个包的层级结构。