我有一个名为"ClassA"的Python类,另外还有一个Python类"ClassB"想要导入"ClassA"。目录结构如下:
MainDir
../Dir
..../DirA/ClassA
..../DirB/ClassB
我该如何使用sys.path
,以便ClassB可以使用ClassA?
作为对“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)
您可以使用相对导入(来自链接的示例,当前模块为 A.B.C
):
from . import D # Imports A.B.D
from .. import E # Imports A.E
from ..F import G # Imports A.F.G
__name__
,因此如果您打算运行当前模块(将 __name__
设置为 __main__
),则相对导入将失败。请注意保持翻译后的内容与原文意思相同,但更加通俗易懂。 - Yibo Yang__init__.py
文件;2)将顶级目录的父目录添加到您的PYTHONPATH
中;3)在Python程序中设置__package__
变量为包含__init__.py
的目录的名称。 - AstroFloyd你真的应该使用包。然后将MainDir放置在sys.path文件系统中的一个位置(例如.../site-packages),然后你可以在ClassB中这样写:
from MainDir.Dir.DirA import ClassA # which is actually a module
您只需在每个目录中放置名为__init__.py
的文件,即可创建包层次结构。
from Dir.DirA import ClassA
。 - Keith__init__.py
文件,以及 2) 将顶级目录的父目录添加到你的 PYTHONPATH
中,并且 3) 在你的 Python 程序中设置 __package__
变量为包含 __init__.py
的目录的名称。现在一切都正常了,谢谢! - AstroFloydimport ClassAA
,其中ClassAA.py也在DirA中,那么当从ClassB导入ClassA时,上述方法会失败。在这种情况下,正确的方法是什么? - Phoeniximport .ClassAA
,或在 ClassB 中使用 import ..DirA.ClassAA
。 - Keith