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.pyscript2/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()获取文件根目录

跨文件调用.py文件件,import本质

[python]目录及文件操作

python os.path模块用法详解