在几个SO的问题中,有这些行来访问代码的父目录,例如os.path.join(os.path.dirname(__file__)) returns nothing和os.path.join(os.path.dirname(__file__)) returns nothing
import os, sys
parentddir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parentddir)
我知道os.path.abspath()
会返回某些内容的绝对路径,而sys.path.append()
会添加要访问的代码的路径。但是下面这个神秘的界限是什么,它到底意味着什么?
os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
是否有另一种方法可以实现附加代码所在位置的父目录的相同目的?
发生此问题的原因是我在跨目录调用函数,有时它们共享相同的文件名,例如script1/utils.py
和script2/utils.py
。我正在调用来自script1/test.py
的函数,调用script2/something.py
包含一个调用script2/utils.py
的函数和以下代码
script1/
utils.py
src/
test.py
script2/
utils.py
code/
something.py
test.py
from script2.code import something
import sys
sys.path.append('../')
import utils
something.foobar()
something.py
import os, sys
parentddir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parentddir)
import utils
def foobar():
utils.somefunc()
答案 0 :(得分:29)
无论脚本位置如何,这都是一种引用路径的聪明方法。您所指的神秘行是:
os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
有3种方法和2种常数存在:
abspath
返回路径的绝对路径join
加入路径字符串dirname
返回文件目录__file__
引用script
的文件名pardir
返回操作系统中父目录的表示形式(通常为..
)因此,表达式以 multiplatform-safe 方式返回执行脚本的完整路径名。无需 hardwire 任何指示,这就是它如此有用的原因。
可能还有其他方法可以获取文件所在位置的父目录,例如,程序具有当前工作目录os.getcwd()
的概念。所以做os.getcwd()+'/..'
可能会奏效。但这非常危险,因为可以更改工作目录。
此外,如果要导入文件,工作目录将指向导入文件,而不是导入文件,但__file__
始终指向实际模块的文件,因此它更安全。
希望这有帮助!
答案 1 :(得分:12)
__file__
表示代码正在执行的文件
os.path.dirname(__file__)
为您提供文件所在的目录
os.path.pardir
代表“..”,表示当前目录之上的一个目录
os.path.join(os.path.dirname(__file__), os.path.pardir)
加入目录名称和“..”
os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
解析上述路径,并为您的文件所在目录的父目录提供绝对路径