os.path.abspath vs os.path.dirname

问题描述:

这些在字符串值中是相等的,但它们真的相等吗?究竟在哪里?os.path.abspath vs os.path.dirname

import os 

path_name1 = os.path.abspath(os.path.dirname(__file__)) 
path_name2 = os.path.dirname(os.path.abspath(__file__)) 

print(path_name1) 
print(path_name2) 
+0

相关:https://*.com/q/37186​​57/674039 – wim

根据here,的__file__的值是一个字符串,当模块被装载进口被设置。从here你可以看到,__file__

到模块的数据的存储位置的路径(内置模块未设置)。

通常,路径已经是模块的绝对路径。因此,您的代码的第4行可以简化为path_name2 = os.path.dirname(__file__)。显然,代码的第3行可以表示为path_name1 = os.path.abspath(path_name2)(让我们暂时忽略执行的顺序)。

接下来是看看dirname做什么。实际上,您可以将dirname视为os.path.split的包装,它将路径分为两部分:(head, tail)tail是给定路径的最后部分,head是给定路径的其余部分。因此,path_name2只是包含加载文件的目录的路径。而且,path_name2是绝对路径。因此os.path.abspath(path_name2)path_name2一样。所以,path_name1path_name2相同。

+0

好吧,这是有道理的,但是如何将第4行简化为path_name2 = os.path.dirname(__ file__)。这似乎只返回一个的空白输出和一个0的len。虽然感谢你的回答,我明白为什么os.path.dirname(os.path.abspath))就是它。 – Mwspencer

+0

如果你把代码放在一个文件中,比如说“test.py”,并用命令“python3 test.py”执行它,你会发现“os.path.dirname(__ file__)”的输出是空的。但是,如果您打开python解释器并使用“导入测试”,则会发现输出不是空白。 –