os.path.abspath 源码分析

os.path.abspath() 函数返回规范化后的绝对路径。当在Windows上时,它可能使用_win32API的_getfullpathname接口。如果路径为空,则会返回当前工作目录。在非Windows系统中,它将路径与当前工作目录合并。源码分析涉及isabs()、getcwdu()、getcwd()和join()等函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值