python - 如何像bash一样在python中扩展环境变量?

标签 python environment-variables

使用 os.path.expandvars 我可以在字符串中扩展环境变量,但需要注意:“格式错误的变量名称和对不存在变量的引用保持不变”(强调我的)。此外,os.path.expandvars 也扩展了转义的 \$

我想以类似 bash 的方式扩展变量,至少在这两点上。比较:

import os.environ
import os.path
os.environ['MyVar'] = 'my_var'
if 'unknown' in os.environ:
  del os.environ['unknown']
print(os.path.expandvars("$MyVar$unknown\$MyVar"))

my_var$unknown\my_var 有:

unset unknown
MyVar=my_var
echo $MyVar$unknown\$MyVar

它给出了 my_var$MyVar,这就是我想要的。

最佳答案

以下实现与 os.path.expandvars 保持完全兼容,但通过可选参数允许更大的灵 active :

import os
import re

def expandvars(path, default=None, skip_escaped=False):
    """Expand environment variables of form $var and ${var}.
       If parameter 'skip_escaped' is True, all escaped variable references
       (i.e. preceded by backslashes) are skipped.
       Unknown variables are set to 'default'. If 'default' is None,
       they are left unchanged.
    """
    def replace_var(m):
        return os.environ.get(m.group(2) or m.group(1), m.group(0) if default is None else default)
    reVar = (r'(?<!\\)' if skip_escaped else '') + r'\$(\w+|\{([^}]*)\})'
    return re.sub(reVar, replace_var, path)

下面是一些调用示例:

>>> expandvars("$SHELL$unknown\$SHELL")
'/bin/bash$unknown\\/bin/bash'

>>> expandvars("$SHELL$unknown\$SHELL", '')
'/bin/bash\\/bin/bash'

>>> expandvars("$SHELL$unknown\$SHELL", '', True)
'/bin/bash\\$SHELL'

关于python - 如何像bash一样在python中扩展环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30734967/

相关文章:

python - 在循环中创建 lambda

python - 代码运行良好,但似乎不是很 Pythonic - 我如何改进这个字典的创建以及从该字典创建组合?

PHP缺少环境变量

clojure - 在 clojure 中加载 .env 文件

java - 在 spring 属性文件中使用环境变量

python - 在 numpy 中重复 matlab dyadup

python - Kubernetes Python Client Watch 停止返回结果,不会失败

python - 有没有办法在pywin32中解码数字COM错误代码

javascript - Node 以编程方式设置导入模块不可用的进程环境变量

ruby-on-rails - Cloud9环境变量