我的代码需要能够在目录列表中搜索特定文件。它需要将别名作为路径名的一部分来处理,并且仍然找到文件的实际路径。例如,它需要将类似$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”被添加到路径中?没有它,我如何获得绝对路径?
答案 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。