为什么os.path.abspath扩展别名时会添加别名?

时间:2018-11-13 14:40:20

标签: python python-3.x path

我的代码需要能够在目录列表中搜索特定文件。它需要将别名作为路径名的一部分来处理,并且仍然找到文件的实际路径。例如,它需要将类似$HOME/test.dat的东西变成/home/greenmatt/test.dat。因此,我正在尝试使用os.path.abspath

不幸的是,结果返回时,别名被粘贴在实际目录名的末尾。以下演示了我所看到的。

从命令行:

> echo $HOME
/home/greenmatt

然后在Python内部:

> python
Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print(os.path.abspath('$HOME'))
/home/greenmatt/$HOME

os.path.realpath做同样的事情:

>>> print(os.path.realpath('$HOME'))
/home/greenmatt/$HOME

为什么多余的“ $ HOME”被添加到路径中?没有它,我如何获得绝对路径?

2 个答案:

答案 0 :(得分:4)

os.path.expandvars(path)在路径中扩展环境变量。扩展后,可以创建绝对路径。一起:

os.path.abspath(os.path.expandvars(path))

答案 1 :(得分:1)

HOME是一个shell变量,abspath根本不使用该shell,因此该参数不会扩展。结果,它被视为在当前目录中命名子目录的文字字符串。您必须自己扩展它。由于HOME是标准环境变量,因此可以使用os.getenv

> os.path.abspath(os.getenv('HOME'))  # $ must be omitted
/home/greenmatt

(当然,如果不是一个环境变量,即使它是在您启动Python的shell中定义的,您也根本无法访问它。)


请考虑以下说明您最初尝试失败的原因。实际上,请使用expandvars as suggested by Michael Butscher