os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) 是啥意思? Python
Posted
技术标签:
【中文标题】os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) 是啥意思? Python【英文标题】:What does os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) mean? pythonos.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) 是什么意思? Python 【发布时间】:2014-01-27 03:41:40 【问题描述】:在几个 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))
有没有其他方法可以达到同样的目的,追加where代码的父目录?
出现这个问题是因为我跨目录调用函数,有时它们共享相同的文件名,例如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()
【问题讨论】:
只是一个问题,你是说你需要这样做才能import utils
?我没有正确理解最后一部分。
【参考方案1】:
无论脚本位置如何,这是一种引用路径的聪明方法。您所指的 cryptic 行是:
os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
存在 3 种方法和 2 个常量:
abspath
返回路径的绝对路径
join
加入路径字符串
dirname
返回文件所在目录
__file__
指的是script
的文件名
pardir
返回操作系统中父目录的表示(通常为..
)
因此,表达式以多平台安全的方式返回执行脚本的完整路径名。无需硬连线任何方向,这就是它如此有用的原因。
可能还有其他方法可以获取文件所在的父目录,例如,程序具有当前工作目录的概念,os.getcwd()
。所以这样做os.getcwd()+'/..'
可能会奏效。但这很危险,因为工作目录是可以改变的。
另外,如果要导入文件,工作目录将指向导入文件,而不是导入对象,但__file__
始终指向实际模块的文件,因此更安全。
希望这会有所帮助!
编辑:P.S. - Python 3 通过让我们以面向对象的方式处理路径,极大地简化了这种情况,因此上面的行变为:
from pathlib import Path
Path(__file__).resolve().parent.parent
【讨论】:
您不能使用__file__
的路径dirname
,因为file 只是脚本的名称。您需要使用os.getcwd()
来获取该路径。【参考方案2】:
__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))
解析上述路径,并为您提供文件所在目录的父目录的绝对路径
【讨论】:
以上是关于os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) 是啥意思? Python的主要内容,如果未能解决你的问题,请参考以下文章
os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) 是啥意思? Python
OS用法详解os.path.abspath(__file__)&os.path.dirname()&os.path.basename(__file__)&os.path.joi
python-基础-os.path.realpath((__file__))os.path.abspath((__file__))os.path.dirname()获取文件根目录