os.path.abspath(path) 官方文档的介绍:
Return a normalized absolutized version ofthe pathname path. On most platforms, this is equivalent to callingthefunction normpath() asfollows:normpath(join(os.getcwd(), path)).
New in version 1.5.2.
这个函数会返回标准化的绝对路径。在大多数平台,它等同于normpath(join(os.getcwd(), path)).,这个后文的源码中会讲到
应用场景:
项目结构:
hello_world---hello.py
----class.py
----xml_parse
----pom_parse.py
例子代码:
def my_print(params):
print params+' abspath ', os.path.abspath(params)
if __name__ =='__main__':
print 'os.getcwd() ',os.getcwd()
my_print('class_test.py')
my_print('pom_parse.py')
输出结果:
注意:pom_parse.py真正的路径应该是
d:\Django-workspace\hello_world\xml_parse\pom_parse.py
我们看看abspath源码:
# Return an absolute path.
try:
from nt import _getfullpathname
except ImportError: # not running on Windows - mock up something sensible
def abspath(path):
"""Return the absolute version of a path."""
if not isabs(path):
if isinstance(path, unicode):
cwd = os.getcwdu()
else:
cwd = os.getcwd()
path = join(cwd, path)
return normpath(path)
else: # use native Windows method on Windows
def abspath(path):
"""Return the absolute version of a path."""
if path: # Empty path must return current working directory.
try:
path = _getfullpathname(path)
except WindowsError:
pass # Bad path - return unchanged.
elif isinstance(path, unicode):
path = os.getcwdu()
else:
1. 首先从nt 模块导入_getfullpathname 。nt 模块提供访问window操作系统的接口,_getfullpathname是win32接口win32API :win32api.GetFullPathName(path),
2.1如果导入不成功,说明程序不是运行在window平台上。重点来了:
if notisabs(path):
if isinstance(path,unicode):
cwd = os.getcwdu()
else:
cwd = os.getcwd()
path = join(cwd, path)
return normpath(path)
这段代码中getcwdu() 和getcwd 都是返回当前工作目录CWD,getcwdu()是unicode 编码,getcwd是string类型。 随后的join(cwd,path) ,把path 和当前工作目录连接
path = join(cwd, path)
2.2如果在window 平台上
if path: # Empty path must return current working directory.
try:
path = _getfullpathname(path)
except WindowsError:
pass # Bad path - return unchanged.
elif isinstance(path, unicode):
path = os.getcwdu()
else:
path = os.getcwd()
在我们的例子里,path = ‘pom_parse.py’ 不为空,所以调用 win32API :win32api.GetFullPathName(path)获得绝对路径。但是,
如果path=’ ’, win32api.GetFullPathName(path)会返回’’ ,而不是当前工作路径CWD。所以这里加上判断path 是否为空,并做处理。
参考链接:
http://woodpecker.org.cn/diveintopython/functional_programming/finding_the_path.html
https://mail.python.org/pipermail/python-bugs-list/2000-July/000897.html
https://docs.python.org/2/library/os.path.html?highlight=os.path.abs#os.path.abspath
http://my.oschina.net/cuffica/blog/33494