【问题标题】:Why is os.path.abspath adding the alias name when it expands an alias?为什么 os.path.abspath 在扩展别名时要添加别名?
【发布时间】:2018-11-13 14:40:19
【问题描述】:

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

【问题讨论】:

  • 你需要os.path.expandvars
  • @MichaelButscher:如果你输入它作为答案,那就行了。我会接受的。

标签: python python-3.x path


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 感谢您的回答。我曾想过这样做,但考虑到我将获得的输入类型,从路径中提取环境变量名称,获取其值,然后将所有内容重新组合在一起会很麻烦。
    • 我忘记了expandvars;绝对是一种更简单的方法。
    猜你喜欢
    • 2011-09-04
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多