ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Python 中访问环境变量?

如何在 Python 中获取环境变量的值?


M
Mateen Ulhaq

通过 os.environ 访问环境变量:

import os
print(os.environ['HOME'])

要查看所有环境变量的列表:

print(os.environ)

如果密钥不存在,则尝试访问它会引发 KeyError。为了避免这种情况:

# Returns `None` if key doesn't exist
print(os.environ.get('KEY_THAT_MIGHT_EXIST'))

# Returns `default_value` if key doesn't exist
print(os.environ.get('KEY_THAT_MIGHT_EXIST', default_value))

# Returns `default_value` if key doesn't exist
print(os.getenv('KEY_THAT_MIGHT_EXIST', default_value))

您好棒,感谢您对“默认安装”的有效回复;从有效的角度快速理解它而不是通过链接。我真的很感激 :) 但是关于我的 (1) 问题,请查看下面的命令和输出片段: >>> import os >>> print os.environ['PYTHONPATH'] Traceback (last recent call last): File " ”,第 1 行,在 文件“C:\Python25\lib\os.py”中,第 435 行,在 getitem return self.data[key.upper()] KeyError: 'PYTHONPATH' >>> print os.environ.get('PYTHONPATH') 无 >>> // PLZ 继续...//
第一种方式脚本抛出异常,而第二种方式给出无。那么,有没有办法让它有意义的价值,还是我做错了???阿米特。
os.environ 是一本字典。尝试访问字典中不存在的键将引发 KeyError。当键不存在时,get 方法简单地返回 None。你有 PYTHONPATH 设置吗?您可以尝试使用保证存在的变量(例如 PATH)吗?它是否返回有意义的值?
PYTHONPATH 用于从 Python 外部向 Python (sys.path) 添加新的搜索路径。看看docs.python.org/using/cmdline.html#environment-variables
.get() 也可以被赋予默认值。
B
Boris Verkhovskiy

检查密钥是否存在(返回 TrueFalse

'HOME' in os.environ

打印密钥时也可以使用get();如果您想使用默认值,这很有用。

print(os.environ.get('HOME', '/home/username/'))

其中 /home/username/ 是默认值


"HOME" in os.environos.environ.get('HOME') 哪个更好?
@endolith 他们做不同的事情。第一个返回 True 或 False,而第二个返回一个值,可能是 None。
@endolith,正确的问题是 "HOME" in os.environ vs os.environ.get('HOME') is None。正如您首先看到的那样更具可读性和舒适的工作。
M
Mateen Ulhaq

以下是检查是否设置了 $FOO 的方法:

try:  
   os.environ["FOO"]
except KeyError: 
   print "Please set the environment variable FOO"
   sys.exit(1)

尝试可以更快。环境变量的情况可能最适合“尝试”:stackoverflow.com/a/1835844/187769
@RandomInsano 更快 =/= 更好。此代码看起来不如 "if 'FOO' not in os.environ: ..." 块可读
如果您只是设置变量,则需要先关闭终端,然后才能对其进行测试。
P
Peter Mortensen

其实可以这样实现:

import os

for item, value in os.environ.items():
    print('{}: {}'.format(item, value))

或者简单地说:

for i, j in os.environ.items():
    print(i, j)

查看参数中的值:

print(os.environ['HOME'])

或者:

print(os.environ.get('HOME'))

要设置值:

os.environ['HOME'] = '/new/value'

不,这个答案确实没有在现有答案之上添加任何内容
这应该被删除,它是其他答案的重复。 str.format 只是一个花哨的补充。
>>> import os, pprint; pprint.pprint(list(os.environ.items()))
第一个答案是整个环境的可读输出,谢谢。为了在 PyCharm 调试器中查看环境,我评估 {k: v for k,v in sorted(os.environ.items())}
它添加了如何设置值
P
Peter Mortensen

您可以使用访问环境变量

import os
print os.environ

尝试查看 PYTHONPATH 或 PYTHONHOME 环境变量的内容。也许这对您的第二个问题有帮助。


P
Peter Mortensen

至于环境变量:

import os
print os.environ["HOME"]

e
erik.weathers
import os
for a in os.environ:
    print('Var: ', a, 'Value: ', os.getenv(a))
print("all done")

这将打印所有环境变量及其值。


P
Peter Mortensen

导入 os 模块:

import os

获取环境变量:

os.environ.get('Env_var')

设置环境变量:

# Set environment variables
os.environ['Env_var'] = 'Some Value'

P
Peter Mortensen

如果您计划在生产网络应用程序代码中使用代码,使用任何网络框架(如 DjangoFlask),请使用项目(如 envparse)。使用它,您可以将值读取为您定义的类型。

from envparse import env
# will read WHITE_LIST=hello,world,hi to white_list = ["hello", "world", "hi"]
white_list = env.list("WHITE_LIST", default=[])
# Perfect for reading boolean
DEBUG = env.bool("DEBUG", default=False)

注意:kennethreitz 的 autoenv 是用于制作项目特定环境变量的推荐工具。对于使用 autoenv 的用户,请注意将 .env 文件保密(公众无法访问)。


envparse 被大约 4,000 人使用,自 2015 年以来一直没有维护,而 dotenv 被 240,000 人使用。人家说了算。
P
Peter Mortensen

还有很多很棒的图书馆。例如,Envs 将允许您从 rad 环境变量中解析对象。例如:

from envs import env
env('SECRET_KEY') # 'your_secret_key_here'
env('SERVER_NAMES',var_type='list') #['your', 'list', 'here']

“这是rad”中的“rad”是什么意思? rad - “1.(俚语)部首剪裁;优秀”
P
Peter Mortensen

你也可以试试这个:

首先,安装 python-decouple

pip install python-decouple

将其导入您的文件中

from decouple import config

然后获取环境变量

SECRET_KEY=config('SECRET_KEY')

详细了解 Python 库 here


M
Meir Gabay

已编辑 - 2021 年 10 月

在@Peter 的评论之后,您可以通过以下方式对其进行测试:

main.py

#!/usr/bin/env python


from os import environ

# Initialize variables
num_of_vars = 50
for i in range(1, num_of_vars):
    environ[f"_BENCHMARK_{i}"] = f"BENCHMARK VALUE {i}"  

def stopwatch(repeat=1, autorun=True):
    """
    Source: https://stackoverflow.com/a/68660080/5285732
    stopwatch decorator to calculate the total time of a function
    """
    import timeit
    import functools
    
    def outer_func(func):
        @functools.wraps(func)
        def time_func(*args, **kwargs):
            t1 = timeit.default_timer()
            for _ in range(repeat):
                r = func(*args, **kwargs)
            t2 = timeit.default_timer()
            print(f"Function={func.__name__}, Time={t2 - t1}")
            return r
        
        if autorun:
            try:
                time_func()
            except TypeError:
                raise Exception(f"{time_func.__name__}: autorun only works with no parameters, you may want to use @stopwatch(autorun=False)") from None
        
        return time_func
    
    if callable(repeat):
        func = repeat
        repeat = 1
        return outer_func(func)
    
    return outer_func

@stopwatch(repeat=10000)
def using_environ():
    for item in environ:
        pass

@stopwatch
def using_dict(repeat=10000):
    env_vars_dict = dict(environ)
    for item in env_vars_dict:
        pass
python "main.py"

# Output
Function=using_environ, Time=0.216224731
Function=using_dict, Time=0.00014206099999999888

如果这是真的……使用 dict() 比直接访问 environ 快 1500 倍。

一种性能驱动的方法 - 调用 environ 代价高昂,因此最好调用一次并将其保存到字典中。完整示例:

from os import environ


# Slower
print(environ["USER"], environ["NAME"])

# Faster
env_dict = dict(environ)
print(env_dict["USER"], env_dict["NAME"])

PS-如果您担心暴露私有环境变量,请在分配后清理 env_dict


P
Peter Mortensen

对于 Django,请参阅 Django-environ

$ pip install django-environ

import environ

env = environ.Env(
    # set casting, default value
    DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env()

# False if not in os.environ
DEBUG = env('DEBUG')

# Raises Django's ImproperlyConfigured exception if SECRET_KEY not in os.environ
SECRET_KEY = env('SECRET_KEY')

一个解释将是有序的。什么是上下文 - 代码在什么上下文中执行?在有 Django 的服务器上?在本地进行测试?别的地方?想法是什么?代码应该完成什么?
i
ichirod

您应该首先使用导入 os

import os

然后实际打印环境变量值

print(os.environ['yourvariable'])

当然,将 yourvariable 替换为您要访问的变量。


n
not2qubit

在单行中使用嵌套 for 循环的棘手部分是您必须使用列表推导。因此,为了打印所有环境变量,而不必导入外部库,您可以使用:

python -c "import os;L=[f'{k}={v}' for k,v in os.environ.items()]; print('\n'.join(L))"