os.path.abspath(os.path.join(os.path.dirname(__ file __),os.path.pardir))是什么意思?蟒蛇

时间:2014-01-08 20:28:43

标签: python import path operating-system directory

在几个SO的问题中,有这些行来访问代码的父目录,例如os.path.join(os.path.dirname(__file__)) returns nothingos.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.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()

2 个答案:

答案 0 :(得分:29)

无论脚本位置如何,这都是一种引用路径的聪明方法。您所指的神秘行是:

os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))

有3种方法和2种常数存在:

  1. abspath返回路径的绝对路径
  2. join加入路径字符串
  3. dirname返回文件目录
  4. __file__引用script的文件名
  5. pardir返回操作系统中父目录的表示形式(通常为..
  6. 因此,表达式以 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))解析上述路径,并为您的文件所在目录的父目录提供绝对路径