在 Python 中评估布尔环境变量
Posted
技术标签:
【中文标题】在 Python 中评估布尔环境变量【英文标题】:Evaluate boolean environment variable in Python 【发布时间】:2020-11-16 20:22:25 【问题描述】:如何在 Python 中评估 env 变量是否为布尔值 True?使用是否正确:
if os.environ['ENV_VAR'] is True:
.......
【问题讨论】:
环境变量永远不能是布尔值,它们总是一个字符串(或不存在)。 所以,我应该写: if os.environ['ENV_VAR'] == 'true': ..... 对吧? 这取决于特定环境变量的语义。它们只是字符串,但程序当然可以赋予特定的字符串一些特殊的含义,比如“真相”。这是否是“真的”。 “真”、“真”、“是”或“1”取决于应用程序。 【参考方案1】:我认为这很好用:
my_env = os.getenv("ENV_VAR", 'False').lower() in ('true', '1', 't')
它允许:true
、True
、TRUE
、1
、"1"
、TrUe
、t
、T
、...
更新:看了克拉斯的评论后,我将原来的代码my_env = bool(os.getenv(...
更新为my_env = os.getenv(...
,因为in
会产生bool
类型
【讨论】:
您可以在列表中添加['true', '1']
其他选项,例如:['true', '1', 'yes', 'y', 't']
在上面的例子中使用bool
是多余的......无论如何a in b
总是一个布尔值
@KlaasvanSchelven,没错,你是对的,我会更新的。谢谢【参考方案2】:
都一样,但对我来说这是最易读的版本:
DEBUG = (os.getenv('DEBUG', 'False') == 'True')
这里除了True
之外的任何东西都将评估为False。 DEBUG 为 False,除非在 ENV 中明确设置为 True
【讨论】:
我会把它设为 os.getenv('DEBUG', 'False').lower() == 'true' 但很棒,谢谢。【参考方案3】:我推荐使用strtobool
函数
示例:
DEBUG = strtobool(os.getenv("DEBUG", "false"))
您可以在 python 文档中查看它们 https://docs.python.org/3/distutils/apiref.html#distutils.util.strtobool
只有一个问题,如果你传递了错误的值,它们会引发错误
代码
from distutils.util import strtobool
print("Value: ", strtobool("false"))
print("Value: ", strtobool("Wrong value"))
输出
Value: 0
Traceback (most recent call last):
File "<string>", line 9, in <module>
File "/usr/lib/python3.8/distutils/util.py", line 319, in strtobool
raise ValueError("invalid truth value %r" % (val,))
ValueError: invalid truth value 'wrong value'
【讨论】:
来自包文档:Note: The entire distutils package has been deprecated and will be removed in Python 3.12
【参考方案4】:
接受“假”、“假”、“真”或“真”的另一种选择:
import os
import ast
def getenv_bool(name: str, default: str = "False"):
raw = os.getenv(name, default).title()
return ast.literal_eval(raw)
【讨论】:
这并不像一开始看起来那么好,因为ast.literal_eval
会给出令人惊讶和令人困惑的(对用户而言)错误消息,例如SyntaxError
和IndentationError
与深错误输入的堆栈跟踪。【参考方案5】:
这两种方式都行不通。如果键不存在,os.environ['ENV_VAR']
单独会导致 KeyError
,如果存在则返回与 'ENV_VAR'
关联的值。在任何一种情况下,您都会出错,或者与True
或"true"
进行比较,这将始终导致False
(除非与环境变量关联的值恰好是"true"
;但这不是你在追求)。
要检查映射是否包含特定键,您可以使用in
:
if 'ENV_VAR' in os.environ:
# It contains the key
else:
# It doesn't contain the key
【讨论】:
【参考方案6】:我使用以下内容来进行更严格的输入并支持输入中更广泛的布尔变量
import os
def getenv_bool(name: str, default: bool = False) -> bool:
return os.getenv(name, str(default)).lower() in ("yes", "y", "true", "1", "t")
用法:
feature_1=getenv_bool('FEATURE_1', False)
【讨论】:
【参考方案7】:强烈推荐environs
:
from environs import Env
env = Env()
MY_BOOL_VALUE = env.bool("MY_BOOL_VALUE", False)
if MY_BOOL_VALUE:
print("MY_BOOL_VALUE was set to True.")
else:
print("MY_BOOL_VALUE was either set to False or was not defined.")
【讨论】:
【参考方案8】:环境变量不是布尔值。默认情况下它们是字符串。您可以按如下方式检查是否存在。
import os
my_env = os.getenv("ENV_VAR")
if bool(my_env): # if my_env: gives the same result
# Env exists
else:
# Env not set
如果找不到变量,os.getenv("ENV_VAR")
返回None
。
如果找到了 env 变量 bool(my_env)
-> bool("False")
和 bool("True")
两者都将评估为 True
,因为 my_env
不再是 None
。
【讨论】:
得到了这个解决方案:bool("False")
评估为True
以上是关于在 Python 中评估布尔环境变量的主要内容,如果未能解决你的问题,请参考以下文章
无法评估表达式。在 SSIS 中(IDTSVariableDispenser100 变量,布尔 isSensitive)