繁体   English   中英

使用 os.path.expandvars 时防止 null 环境变量

[英]Protect against null environment variables when using os.path.expandvars

我如何防止 Python 的os.path.expandvars()处理 null/unset 环境变量?

来自os.path

格式错误的变量名称和对不存在变量的引用保持不变。

>>> os.path.expandvars('$HOME/stuff')
'/home/dennis/stuff'
>>> os.path.expandvars('foo/$UNSET/bar')
'foo/$UNSET/bar'

我可以与其他路径处理( expanduser()realpath(), normpath()等)分开执行此步骤,而不是将它们全部链接在一起并检查结果是否未更改,但在没有更改时这是正常的存在变量 - 所以我还必须解析字符串以查看它是否有任何变量。 我担心这可能不够稳健。

使用结果创建文件时会出现此问题。 我最终得到一个文件,其中变量名作为文件名的文字部分。 我想拒绝异常输入。

您可以使用string.Template ,它使用类似的美元符号语法对变量进行插值,但如果不存在某些内容而不是将其保留,则会引发KeyError

import os
from string import Template
print(Template('$HOME/stuff').substitute(os.environ))

扩展杰森的

def expand_user_vars(s, variants='$%s ${%s} %%%s%%'):
    '''Return a string expanded for both leading "~/" or "~username/" and
    environment variables in the forms given by variants.


    >>> s = "~roland/.local/%XYZ%$XYZ${XYZ}"
    >>> expand_user_vars(s)
    '/home/roland/.local/'
    >>> s = "$HOME/.local/%XYZ%$XYZ${XYZ}"
    >>> expand_user_vars(s)
    '/home/roland/.local/'
    >>> s = "$EDITOR"
    >>> 'EDITOR' not in expand_user_vars(s)
    True

    '''
    s = os.path.expanduser(s)
    #python2 does not have KeyError in str(e)
    remx = re.compile(r"(?:KeyError:)?\s*'(\w+)'")
    while True:
        try:
            s = string.Template(s).substitute(os.environ)
            break
        except KeyError as e:
            reme = str(e)
            remxo = remx.match(reme)
            if remxo:
                g1 = remxo.group(1)
                for v in variants.split():
                    s = s.replace(v%g1,'')
                continue
    return s

否则, echo在 Linux 和 MacOS 以及 Windows 上存在。将下面的示例替换为...'echo '+s...

import subprocess
netrc_file = subprocess.check_output('echo ${NETRC:-~/.netrc}',shell=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM