[英]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.