如何检查操作系统变量并将它们与列表中的 Python 变量同名使用

Posted

技术标签:

【中文标题】如何检查操作系统变量并将它们与列表中的 Python 变量同名使用【英文标题】:How to check OS variables and use them with same name as Python variable from a list 【发布时间】:2022-01-18 16:48:36 【问题描述】:

希望我能正确解释我想要做什么。我想检查从列表中给出的变量是否存在于操作系统中,如果存在,请在 python 中使用相同的操作系统变量名称和值。

这就是我现在的做法,但我认为这是很多代码,如果想要更多的操作系统变量,我会更大。那么,如何才能更智能、更高效地开展这项工作呢?

操作系统(Linux)变量

export WEB_URL="https://google.com"
export WEB_USERNAME="Foo"
export WEB_PASSWORD="Bar"
# Check os env variables
if "WEB_URL" in os.environ:
    web_url = os.environ.get("WEB_URL")
else:
    logger.error("No URL os env find please check")

if "WEB_USERNAME" in os.environ:
    web_username = os.environ.get("WEB_USERNAME")
else:
    logger.error("No USERNAME os env find please check")

if "WEB_PASSWORD" in os.environ:
    web_password = os.environ.get("WEB_PASSWORD")
else:
    logger.error("No PASSWORD os env find please check")

一开始一定是这样的吗?

os_variables = ["WEB_URL", "WEB_USERNAME", "WEB_PASSWORD"]

for var in os_variables:
    if var in os.environ:
        print(var.lower(), "=", os.environ.get(f"var"))

结果:

web_url = https://google.com
web_username = Foo
web_password = Bar

所以上面打印的应该是变量,只是为了说明我的意思

【问题讨论】:

您所说的“操作系统变量”更恰当地称为“环境变量”。你展示的循环就是对这种重复代码的典型重构。 是否有特定原因需要使用相同的名称?否则,os.environ 已经是您正在访问的字典,所以除了检查键是否存在之外,您真的需要进一步分配值吗?您可以轻松地创建一个包含所有必要键值的子字典 @OneCricketeer 是的,我需要在我的 python 脚本中进一步使用变量,首先我想检查它们是否存在。 os.environ.get() 将返回 None。您还可以为.get() 提供默认值。我的观点是,您可以在真正需要变量的地方传递os.environ,或者您可以围绕它构建一些配置类包装器来进行验证检查。否则,一次性使用列表对您正在做的事情完全有效 【参考方案1】:

作为妥协,我终于想出了这个解决方案

env_variables = ('WEB_URL', 'WEB_USERNAME', 'WEB_PASSWORD')


def check_env(var):
    for var in env_variables:
        if var in os.environ:
            if os.environ[var] == "":
                logging.error(f'var is empty, please set a value')
                sys.exit()
        else:
            logging.error(
                f'var does not exist, please setup this env variable')
            sys.exit()


check_env(env_variables)

【讨论】:

【参考方案2】:

如果我正确理解您的问题,您将需要使用eval() 和exec()。也许是这样的:

exec(str(eval(var.lower(), "=", "'", os.environ.get(f"var")"'")))

首先评估应该会给您类似web_url = 'https://google.com' 的信息。如果将其转换为字符串,则可以执行,但在这种情况下请注意全局变量和局部变量。

【讨论】:

谢谢,我会检查的。检查某些特定环境变量并在检查它们是否存在后在python中使用它们的最佳选择是什么?或者我应该问你应该怎么做才能解决这个问题?在阅读了一些关于 eval 和 exec 的文章后,我不想使用它们,因为它们是有风险的,并且继续使用我重复的 if else 语句

以上是关于如何检查操作系统变量并将它们与列表中的 Python 变量同名使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在不满足给定条件的情况下创建一系列变量并将它们存储在列表中?

如何导入子模块并将它们别名为ES6中的变量

如何在文本中找到像“e3”这样的特殊标记并将它们替换为列表中的匹配数据?

我可以解压缩变量以检查其他列表中的成员资格吗?

如何生成随机字母并将它们分配给 Python 中的变量

如何组合字符串中的字母并将它们保存到JAVA,Android中的其他变量中