首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在转义特殊字符的同时扩展python中的环境变量?

如何在转义特殊字符的同时扩展python中的环境变量?
EN

Stack Overflow用户
提问于 2016-03-09 23:51:19
回答 2查看 7.5K关注 0票数 4

在主机上,我有一个带有引号的环境变量,如下所示:

代码语言:javascript
运行
复制
export VALUE_WITH_QUOTE_FROM_OS='quote"value'

当我在巴什上回音的时候,很好

代码语言:javascript
运行
复制
#echo $VALUE_WITH_QUOTE_FROM_OS
quote"value

我有以下json字符串:

代码语言:javascript
运行
复制
json_str = '{"key":"${VALUE_WITH_QUOTE_FROM_OS}"}'

然后,在进一步处理之前,我希望在python脚本中扩展环境变量,如下所示

代码语言:javascript
运行
复制
json_str = os.path.expandvars(json_str)
json_dict = json.loads(json_str)

但是,这种扩展会破坏json语法,因为json_str已经成为

代码语言:javascript
运行
复制
'{"key":"quote"value"}' (<== bad unescaped quote in the value)

而不是

代码语言:javascript
运行
复制
'{"key":"quote\"value"}' 

在扩展值时,我是否可以通知os.path.expandvars()以转义双引号?如果不是,我应该如何展开环境变量,以便可以转义双引号。

注释1环境变量的值是一个安全令牌,所以我必须保持双引号不变。

Note 2当前的json接口已经被确定并被广泛使用。此json_str被传递给我,因此我应该并且必须只展开json字符串中由${}表示的环境变量,不允许进行其他修改。

Note 3此json_str非常大,具有复杂、动态、嵌套的结构,并且由无法访问主机os环境变量的多个客户端使用。虽然我可以先加载json_str,遍历字典来解析环境变量,然后将dict转储回json_str,然后再分派给所有客户端,但我认为它比作为字符串处理它的效率要低。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-10 00:14:37

我当然不能保证这将具有os.path的可移植性,但这应该主要适用于使用posix的系统--我认为:

代码语言:javascript
运行
复制
import re
import os
import json

regex = re.compile(r'\$(\w+|\{[^}]*\})')
json_str = '{"key":"${FOO}"}'
def os_expandvar(match):
    v = match.group(1)
    if v.startswith('{') and v.endswith('}'):
        v = v[1:-1]
    return json.dumps(os.environ.get(v, ''))[1:-1]
print(regex.sub(os_expandvar, json_str))

正则表达式(和一般的实现思想)是从os.path.expandvarsposixpath模块中的实现中借用来的。为了简化答案,我去掉了大量的复杂性,但是如果您发现需要它,您可以将它放回去。

这应该处理替换字符串为$FOO${FOO}的情况,就像posix系统中的典型情况一样。

这里还有其他选择..。通过给出的示例,您可以首先解码json,然后展开所有的值。根据json的格式,您可能需要一个递归函数来完成工作:

代码语言:javascript
运行
复制
# untested
def json_expandvars(o):
    if isinstance(o, dict):
       return {json_expandvars(k): json_expandvars(v) for k, v in o.items()}
    elif isinstance(o, list):
       return [json_expandvars(v) for v in o]
    elif isinstance(o, basestring):
       return os.path.expandvars(o)
    else:
       return o

json_dict = json_expandvars(json.loads(json_str))
票数 3
EN

Stack Overflow用户

发布于 2016-03-10 00:31:53

os.path.expandvars不可能知道结果需要一个有效的JSON字符串,引号转义。

相反,在将JSON解码为字典之后,展开环境变量

代码语言:javascript
运行
复制
json_dict = json.loads(json_str);
json_dict['key'] = os.path.expandvars(json_dict['key']);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35904997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档