如何导入上层目录中的Python类?
我想从一个位于当前目录上面的文件里的类进行继承。
这样做可以相对导入那个文件吗?
11 个回答
@gimel的回答是正确的,前提是你能保证他提到的包的层级结构。如果你不能保证这一点——如果你的真实需求如你所说,完全与目录相关,而与打包没有必要的关系——那么你需要使用 __file__
来找出父目录(调用几次 os.path.dirname
就可以做到;-),然后(如果那个目录还不在 sys.path
中)临时把这个目录放到 sys.path
的最前面,接着使用 __import__
导入,最后再把这个目录移除——这确实是个麻烦的工作,但“必须做的时候就得做”(而Python努力不阻止程序员做那些必须做的事情——就像ISO C标准在其前言的“C的精神”部分所说的那样!)。
这里有一个可能对你有用的例子:
import sys
import os.path
sys.path.append(
os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
import module_in_parent_dir
当然可以!请看下面的内容:
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当用户点击一个按钮时,程序就要做出反应。这个过程就像是给程序设定了一些“规则”,让它知道在什么情况下该做什么事情。
另外,程序中有很多不同的部分,它们可以互相交流。就像人们在聊天一样,程序的不同部分通过发送信息来合作完成任务。这种信息的传递方式就叫做“消息传递”。
在编写代码时,我们常常需要使用一些工具和库,这些工具就像是程序的“助手”,可以帮助我们更快地完成工作。使用这些工具可以让我们避免从头开始编写所有的代码,节省时间和精力。
总之,编程就像是在给计算机下指令,让它按照我们的想法去做事情。通过设置条件、使用工具和进行信息交流,我们可以创建出各种各样的程序。
希望这些解释能帮助你更好地理解编程的基本概念!
import sys
sys.path.append("..") # Adds higher directory to python modules path.
from ..subpkg2 import mod
根据Python的文档:在包的层级结构中,使用两个点。正如导入语句的说明所说:
当你指定要导入哪个模块时,不需要写出模块的完整名称。如果一个模块或包包含在另一个包里,你可以在同一个顶层包内进行相对导入,而不需要提到包的名称。通过在
from
后面指定的模块或包前加上点,你可以指定要向上走多少层包的结构,而不需要写出确切的名称。一个点表示当前模块所在的包。两个点表示上升一个包层级。三个点表示上升两个层级,依此类推。所以如果你在pkg
包中的一个模块里执行from . import mod
,你最终会导入pkg.mod
。如果你在pkg.subpkg1
中执行from ..subpkg2 import mod
,你将导入pkg.subpkg2.mod
。关于相对导入的具体说明可以在PEP 328中找到。
PEP 328 讨论了绝对导入和相对导入。