如何访问环境变量值?

Ami*_*dav 1878 python environment-variables

我设置了一个我想在Python应用程序中访问的环境变量.我如何获得这个价值?

Rod*_*Rod 2823

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

import os
print(os.environ['HOME'])
Run Code Online (Sandbox Code Playgroud)

或者您可以使用以下命令查看所有环境变量的列表:

os.environ
Run Code Online (Sandbox Code Playgroud)

有时您可能需要查看完整列表!

# using get will return `None` if a key is not present rather than raise a `KeyError`
print(os.environ.get('KEY_THAT_MIGHT_EXIST'))

# os.getenv is equivalent, and can also give a default value instead of `None`
print(os.getenv('KEY_THAT_MIGHT_EXIST', default_value))
Run Code Online (Sandbox Code Playgroud)

Windows上的Python默认安装C:\Python.如果你想在运行python时找到答案,你可以这样做:

import sys
print(sys.prefix)
Run Code Online (Sandbox Code Playgroud)

  • `.get()`也可以是默认值. (5认同)
  • os.environ是一本字典.尝试访问字典中不存在的键将引发KeyError.当密钥不存在时,get方法只返回None.你有PYTHONPATH套装吗?你能尝试使用PATH等保证存在的变量吗?它是否返回有意义的值? (4认同)
  • PYTHONPATH用于从Python外部向Python(sys.path)添加新的搜索路径.看看http://docs.python.org/using/cmdline.html#environment-variables (2认同)

小智 212

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

'HOME' in os.environ
Run Code Online (Sandbox Code Playgroud)

你也可以get()在打印钥匙时使用; 如果您想使用默认值,则非常有用.

print(os.environ.get('HOME', '/home/username/'))
Run Code Online (Sandbox Code Playgroud)

哪里/home/username/是默认值

  • @endolith他们做了不同的事情.第一个返回True或False,而第二个返回一个值,可能是None. (8认同)
  • @endolith,正确的问题是“os.environ 中的“HOME””与“os.environ.get('HOME') is None”。正如您所看到的,First 更具可读性且使用起来更舒适。 (3认同)
  • os.environ`或os.environ.get('HOME')中的“ HOME”哪个更好? (2认同)

Sco*_*son 50

最初的问题(第一部分)是"如何在Python中检查环境变量".

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

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

  • os.environ中的"FOO" (58认同)
  • @RandomInsano更快=/=更好.这段代码看起来不像一个``if'FOO'而不是os.environ:..."`block (8认同)
  • 谢谢你提醒我'更好'是主观的 (8认同)
  • 尝试可以更快.env vars的情况可能最适合'尝试':http://stackoverflow.com/a/1835844/187769 (4认同)

and*_*089 37

您可以使用访问环境变量

import os
print os.environ
Run Code Online (Sandbox Code Playgroud)

尝试查看PYTHONPATH或PYTHONHOME环境变量的内容,这可能对您的第二个问题有所帮助.但是你应该澄清一下.


Geo*_*ili 35

导入os模块:

import os
Run Code Online (Sandbox Code Playgroud)

要获取环境变量:

os.environ.get('Env_var')
Run Code Online (Sandbox Code Playgroud)

设置环境变量:

# Set environment variables
os.environ['Env_var'] = 'Some Value'
Run Code Online (Sandbox Code Playgroud)


Jim*_*som 24

至于环境变量:

import os
print os.environ["HOME"]
Run Code Online (Sandbox Code Playgroud)

在你得到合适的答案之前,我担心你不得不更多地充实你的第二点.


小智 21

import os
for a in os.environ:
    print('Var: ', a, 'Value: ', os.getenv(a))
print("all done")
Run Code Online (Sandbox Code Playgroud)

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


小智 16

实际上,可以这样做:

import os

for item, value in os.environ.items():
    print('{}: {}'.format(item, value))
Run Code Online (Sandbox Code Playgroud)

或者简单地:

for i, j in os.environ.items():
    print(i, j)
Run Code Online (Sandbox Code Playgroud)

要查看参数中的值:

print(os.environ['HOME'])
Run Code Online (Sandbox Code Playgroud)

要么:

print(os.environ.get('HOME')
Run Code Online (Sandbox Code Playgroud)

设置值:

os.environ['HOME'] = '/new/value'
Run Code Online (Sandbox Code Playgroud)

  • 这应该被删除,它与其他答案重复。`str.format` 只是一个奇特的补充。 (6认同)
  • 第一个答案,整个环境具有可读输出,谢谢。要在 PyCharm 调试器中查看 env,我评估 `{k: v for k,v insorted(os.environ.items())}` (4认同)
  • 它添加了如何设置该值 (4认同)
  • 不,这个答案确实不会在现有答案的基础上添加任何内容 (3认同)
  • 可以在接受的答案中解决。 (2认同)

Ren*_*han 14

如果您计划在生产Web应用程序代码中
使用代码,使用任何Web框架(如Django/Flask),请使用像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)
Run Code Online (Sandbox Code Playgroud)

注意:kennethreitz的autoenv是用于制作项目特定环境变量的推荐工具,请注意那些正在使用的人autoenv请将.env文件保密(公共场所无法访问)

  • [envparse](https://github.com/rconradharris/envparse) 约有 4,000 人使用,自 2015 年以来一直没有维护,而 [dotenv](https://github.com/theskumar/python-dotenv) ,有 240,000 人使用。人民已经发话了。 (2认同)

Mei*_*bay 13

编辑 - 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
Run Code Online (Sandbox Code Playgroud)
python "main.py"

# Output
Function=using_environ, Time=0.216224731
Function=using_dict, Time=0.00014206099999999888
Run Code Online (Sandbox Code Playgroud)

如果这是真的……使用 adict()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"])
Run Code Online (Sandbox Code Playgroud)

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

  • 你说的消毒是什么意思?就像删除包含敏感数据的条目一样,这样您也许就不会意外地将 api 密钥或机密扔到应用程序日志中? (2认同)

Blo*_*gic 10

您可以使用python-dotenv模块来访问环境变量

使用以下命令安装模块:

pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)

之后,创建一个.env包含以下条目的文件:

BASE_URL = "my_base_url"
Run Code Online (Sandbox Code Playgroud)

然后将模块导入到你的Python文件中

import os
from dotenv import load_dotenv

# Load the environment variables
load_dotenv()

# Access the environment variable
print(os.getenv("BASE_URL"))
Run Code Online (Sandbox Code Playgroud)

  • 为什么要为如此简单的事情安装第三方库? (2认同)

小智 7

对于 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')
Run Code Online (Sandbox Code Playgroud)

  • 应该有一个解释。上下文是什么——代码在什么上下文中执行?在带有 Django 的服务器上?本地测试一下?别的地方?这是什么想法?代码应该完成什么? (3认同)

小智 6

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

from envs import env
env('SECRET_KEY') # 'your_secret_key_here'
env('SERVER_NAMES',var_type='list') #['your', 'list', 'here']
Run Code Online (Sandbox Code Playgroud)

  • *“which is rad”* 中的“rad”是什么意思?*[rad](https://en.wiktionary.org/wiki/rad#Adjective)* - *“1.(俚语)部首剪裁;优秀”* (3认同)

小智 6

你也可以试试这个:

首先,安装 python-decouple

pip install python-decouple
Run Code Online (Sandbox Code Playgroud)

将其导入到您的文件中

from decouple import config
Run Code Online (Sandbox Code Playgroud)

然后获取环境变量

SECRET_KEY=config('SECRET_KEY')
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关 Python 库的更多信息。