簡體   English   中英

如何在 Python 中訪問環境變量?

[英]How do I access environment variables in Python?

如何在 Python 中獲取環境變量的值?

環境變量通過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))

檢查密鑰是否存在(返回TrueFalse

'HOME' in os.environ

打印密鑰時也可以使用get() 如果您想使用默認值,這很有用。

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

其中/home/username/是默認值

以下是檢查是否設置$FOO的方法:

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

其實可以這樣實現:

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'

您可以使用訪問環境變量

import os
print os.environ

嘗試查看 PYTHONPATH 或 PYTHONHOME 環境變量的內容。 也許這對您的第二個問題有幫助。

至於環境變量:

import os
print os.environ["HOME"]
import os
for a in os.environ:
    print('Var: ', a, 'Value: ', os.getenv(a))
print("all done")

這將打印所有環境變量及其值。

導入os模塊:

import os

獲取環境變量:

os.environ.get('Env_var')

設置環境變量:

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

如果您打算在生產 Web 應用程序代碼中使用代碼,使用任何 Web 框架(如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文件保密(公眾無法訪問)。

還有很多很棒的圖書館。 例如, Envs將允許您從環境變量(即 rad)中解析對象。 例如:

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

你也可以試試這個:

一、安裝python-decouple

pip install python-decouple

將其導入您的文件中

from decouple import config

然后獲取環境變量

SECRET_KEY=config('SECRET_KEY')

在此處閱讀有關 Python 庫的更多信息。

已編輯 - 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

對於 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')

您應該首先使用導入 os

import os

然后實際打印環境變量值

print(os.environ['yourvariable'])

當然,將 yourvariable 替換為您要訪問的變量。

在單行中使用嵌套for 循環的棘手部分是您必須使用列表推導。 因此,為了打印所有環境變量,而不必導入外部庫,您可以使用:

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

.env 文件

這是我的 .env 文件(我更改了每個鍵中的多個字符以防止人們入侵我的帳戶)。

SECRET_KEY=6g18169690e33af0cb10f3eb6b3cb36cb448b7d31f751cde
AWS_SECRET_ACCESS_KEY=18df6c6e95ab3832c5d09486779dcb1466ebbb12b141a0c4
DATABASE_URL='postgres://drjpczkqhnuvkc:f0ba6afd133c53913a4df103187b2a34c14234e7ae4b644952534c4dba74352d@ec2-54-146-4-66.compute-1.amazonaws.com:5432/ddnl5mnb76cne4'
AWS_ACCESS_KEY_ID=AKIBUGFPPLQFTFVDVIFE
DISABLE_COLLECTSTATIC=1
EMAIL_HOST_PASSWORD=COMING SOON
MAILCHIMP_API_KEY=a9782cc1adcd8160907ab76064411efe-us17
MAILCHIMP_EMAIL_LIST_ID=5a6a2c63b7
STRIPE_PUB_KEY=pk_test_51HEF86ARPAz7urwyGw9xwLkgbgfCYT48LttlwjEkb88I7Ljb5soBtuKXBaPiKfuu0Cx2BzIowR3jJFkC8ybFBAEf00DFY46tB8
STRIPE_SECRET_KEY=sk_test_19HEF55BCEAz7urwytx7tO3QCxV4R8DEFXbqj6esg7OKuybiSTI8iJD8mmJUQpg4RKENxuS04DKOCzYHpDkAjUttO00LOmsT5Eg

設置

有人告訴我我的數據已損壞。 我正在努力弄清楚發生了什么。 我懷疑 .env 中的值沒有傳遞到我的設置文件中。

print(os.environ.get('AWS_SECRET_ACCESS_KEY'))
print(os.environ.get('AWS_ACCESS_KEY_ID'))
print(os.environ.get('AWS_SECRET_ACCESS_KEY'))
print(os.environ.get('DATABASE_URL'))
print(os.environ.get('SECRET_KEY'))
print(os.environ.get('DISABLE_COLLECTSTATIC'))
print(os.environ.get('EMAIL_HOST_PASSWORD'))
print(os.environ.get('MAILCHIMP_API_KEY'))
print(os.environ.get('MAILCHIMP_EMAIL_LIST_ID'))
print(os.environ.get('STRIPE_PUB_KEY'))
print(os.environ.get('STRIPE_SECRET_KEY'))

唯一正確打印的值是 SECRET_KEY。 我查看了 .env 文件,並且在我的一生中看不到 SECRET_KEY 起作用的任何原因,而沒有其他原因。

通過將其放在打印語句之上,我最終使一切正常。

from dotenv import load_dotenv   #for python-dotenv method
load_dotenv()                    #for python-dotenv method

和做

pip install -U python-dotenv

我仍然不確定為什么 SECRET_KEY 在所有其他人都壞了的情況下工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM