目录
一、realpath、getcwd、abspath各是干嘛的?
前言
在写代码过程中,经常会遇到 realpath、getcwd、abspath。但是对于他们的区别就傻傻分不清楚,对于他们应该在什么场景就更是不知道了。今天特别记录一下,今后有据可依。
一、realpath、getcwd、abspath各是干嘛的?
- realpath 1、获取代码所在的脚本文件的绝对路径(用的多) 2、获取当前应用的真实路径,而非软连接路径(用得少)
- abspath 返回一个目录的绝对路径
- getcwd 获取当前的工作目录
1、首先我们需要区分,当前工作目录和绝对路径的区别,也就可以把getcwd和其他两个方法的区别分开。
我们知道代码在执行过程中,都会默认使用当前的路径作为工作目录,这时候getcwd得到的路径和其他两个方法是一样的。但是,我们一旦修改的工作目录,那么getcwd方法就会得到我们修改的工作目录,而其他两个方法得到的路径不变。
>>> os.getcwd()
'C:\\Users\\ASUS\\Desktop\\项目资料\\模型引擎项目\\luigi_process_test\\code\\standard_test'
>>> os.getcwd()
'C:\\Users\\ASUS\\Desktop\\项目资料\\模型引擎项目\\luigi_process_test\\code'
2、然后再区分 realpath和abspath的区别,其实可以以一句话总结
如桌面有文件的快捷方式,abs就是快捷方式的路径,real就是快捷方式对应文件的路径
注意:他们都是返回绝对路径。
>>> os.path.realpath("/etc/sysconfig/selinux")
'/etc/selinux/config'
>>> os.path.realpath("/usr/bin/python")
'/usr/bin/python2.7'
>>> os.path.abspath("/etc/sysconfig/selinux")
'/etc/sysconfig/selinux'
>>> os.getcwd()
'/root'
>>> os.path.abspath("python_modu")
'/root/python_modu
上面例子可以看到,etc/sysconfig/selinux其实是/etc/selinux/config 应用的一个软连接,同理/usr/bin/python其实是/usr/bin/python2.7的一个软连接。如果使用abspath,那他就会返回当前软连接的一个绝对路径而不会取寻找应用真实的位置了。
二、常用应用场景
1、getcwd
获取当前工作目录,并配合chdir()方法,修改当前的工作目录,来进行定位。
那么,有一个问题:如果A调用了B,B里面有一行getcwd()的代码,那么,这里的getcwd应该是A的目录还是B的目录呢?我们验证一下。
# inner_test.py 代码
import os
def inner_test_getcwd():
print(os.getcwd())
# test.py 代码
from standard_test.inner_test import inner_test_getcwd
inner_test_getcwd()
# 输出
C:\Users\ASUS\Desktop\项目资料\模型引擎项目\luigi_process_test\code
首先我们选用上面的目录结构,然后使用test.py代码引用inner_test.py里面的getcwd,结果输出了调用方的工作目录。所以我们python是以最外层的调用方作为默认的工作目录,然后我们可以再被调用方使用os.getcwd()来获取最外层的调用的目录(也就是工作目录)
2、realpath
常用来获取当前脚本文件的绝对路径。不受调用方的影响。我们同样采用刚才的目录结构,但是修改test.py和inner_test.py的代码如下。
# inner_test.py 代码
import os
def inner_test_realpath():
print("inner-test-dir-realpath: ",os.path.dirname(os.path.realpath(__file__)))
# test.py 代码
import os
from standard_test.inner_test import inner_test_realpath
print("test-dir-realpath: ", os.path.dirname(os.path.realpath(__file__)))
inner_test_realpath()
# 输出
test-dir-realpath: C:\Users\ASUS\Desktop\项目资料\模型引擎项目\luigi_process_test\code
inner-test-dir-realpath: C:\Users\ASUS\Desktop\项目资料\模型引擎项目\luigi_process_test\code\standard_test
可以看出,realpath得到的是当前执行代码的文件的绝对路径。
3、abspath
这个好像应用的不是很多,后面如果有他的应用场景,我再更新过来。