Как получить доступ к значениям переменных среды

avatar
Amit Yadav
5 февраля 2011 в 13:03
2252073
15
2594

Я установил переменную среды, к которой хочу получить доступ в моем приложении Python. Как мне узнать его значение?

Источник

Ответы (15)

avatar
Rod
5 февраля 2011 в 13:18
3821

Доступ к переменным среды осуществляется через os.environ

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

Или вы можете просмотреть список всех переменных среды, используя:

os.environ

Иногда может потребоваться полный список!

# 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))

Установка Python по умолчанию в Windows: C:\Python. Если вы хотите узнать это при запуске python, вы можете сделать:

import sys
print(sys.prefix)
Amit Yadav
5 февраля 2011 в 14:47
1

привет, стержень, спасибо за эффективный ответ по поводу «установки по умолчанию»; эффективен с точки зрения быстрого понимания, а не перехода по ссылкам. Я очень благодарен за это :) но по поводу моего (1) вопроса, пожалуйста, посмотрите на приведенный ниже фрагмент команды и выходных данных: >>> import os >>> print os.environ ['PYTHONPATH'] Traceback (последний вызов последним): File " <console> ", строка 1, в <module> файле" C: \ Python25 \ lib \ os.py ", строка 435, в getitem return self.data [key.upper ()] KeyError: 'PYTHONPATH' >>> print os.environ.get ('PYTHONPATH') None >>> // PLZ для продолжения ... //

Amit Yadav
5 февраля 2011 в 14:49
0

В первом случае скрипт выдает исключение, тогда как второй - нет. Итак, есть ли способ получить это значимое значение, или я делаю неправильно ??? Амит.

Rod
5 февраля 2011 в 19:21
8

os.environ - это словарь. Попытка получить доступ к ключу, отсутствующему в словаре, вызовет ошибку KeyError. Метод get просто возвращает None, если ключ не существует. У вас установлен PYTHONPATH? Можете ли вы попробовать с такой переменной, как PATH, которая гарантированно существует? Возвращает ли он значимое значение?

Amit Yadav
7 февраля 2011 в 08:02
0

Я не устанавливал (PYTHONPATH) раньше; то, что я делаю, просто перейдите в командную строку и введите CMD в любом месте (поскольку python.exe находится в моей оболочке PATH). Если я пытаюсь получить доступ к переменной Window ENVIRONMENT, она дает сопоставленное значение, но проблема с переменной Python ENVIRONMENT, например; ПИТОНПАТ и ПИТОНОМ.

Rod
7 февраля 2011 в 14:41
2

PYTHONPATH используется для добавления нового пути поиска в Python (sys.path) извне Python. Взгляните на docs.python.org/using/cmdline.html#environment-variables

mrid
29 января 2017 в 07:29
0

Есть ли способ сохранить эту переменную постоянной ?? Когда я запускаю python позже, переменная окружения исчезает и вместо этого выдает raise KeyError(key)

Rod
31 января 2017 в 14:04
0

@mrid Нет прямого пути из python для сохранения переменной окружения. В Windows вы можете записать их в реестр, в Linux / OSX вам, возможно, придется изменить среду с помощью скриптов.

Charlie Parker
9 мая 2017 в 20:48
0

это портативное решение?

Rod
12 мая 2017 в 19:00
0

@CharlieParker Да, насколько я знаю, он портативный.

Gringo Suave
21 сентября 2018 в 15:25
25

.get() также можно задать значение по умолчанию.

RicarHincapie
13 августа 2020 в 16:02
0

Чтобы проверить, установлено ли какое-либо значение для переменной среды, попробуйте: if getenv('your_variable') == 'your value':

avatar
not2qubit
29 декабря 2021 в 20:54
0

Сложная часть использования вложенных циклов for в однострочники заключается в том, что у вас есть для использования понимания списка. Итак, чтобы напечатать все переменные среды без необходимости импорта сторонней библиотеки, вы можете использовать:

python -c "import os;L=[f'{k}={v}' for k,v in os.environ.items()]; print('\n'.join(L))"
avatar
Giorgi Imerlishvili
19 мая 2021 в 09:22
5

Импортируйте модуль os:

import os

Чтобы получить переменную среды:

os.environ.get('Env_var')

Чтобы установить переменную среды:

# Set environment variables
os.environ['Env_var'] = 'Some Value'
avatar
ichirod
14 марта 2021 в 06:41
1

Сначала следует импортировать ОС с помощью

import os

, а затем фактически распечатать значение переменной среды

print(os.environ['yourvariable'])

Конечно, замените yourvariable той переменной, к которой вы хотите получить доступ.

avatar
Meir Gabay
15 января 2021 в 00:39
4

Отредактировано - октябрь 2021 г.

Следуя комментарию @ 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://coderhelper.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

Если это правда ... В 1500 раз быстрее использовать dict() вместо прямого доступа к environ.


Подход, ориентированный на производительность - вызов environ стоит дорого, поэтому лучше позвонить один раз и сохранить в словаре. Полный пример:

from os import environ


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

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

P.S - если вы беспокоитесь о раскрытии частных переменных среды, очистите env_dict после назначения.

Peter Mortensen
25 июля 2021 в 21:17
1

У вас есть контрольные данные?

Meir Gabay
1 октября 2021 в 16:11
0

Спасибо, Питер, я обновил свой ответ

avatar
Steve Mitto
8 апреля 2020 в 15:20
7

Вы также можете попробовать следующее:

Сначала установите python-decouple

pip install python-decouple

Импортируйте его в свой файл

from decouple import config

Затем получите переменную среды

SECRET_KEY=config('SECRET_KEY')

Подробнее о библиотеке Python здесь.

avatar
Leonardo
20 ноября 2019 в 15:36
4

Для Django см. Django-environment.

$ 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')
Peter Mortensen
25 июля 2021 в 21:11
1

Объяснение было бы в порядке. Каков контекст - в каком контексте выполняется код? На сервере с Django? Локально для тестирования? Где-нибудь еще? В чем идея? Что должен выполнять код?

avatar
Peter Konneker
19 декабря 2018 в 16:00
12

Есть также ряд замечательных библиотек. Envs, например, позволит вам анализировать объекты из переменных среды, что является rad. Например:

from envs import env
env('SECRET_KEY') # 'your_secret_key_here'
env('SERVER_NAMES',var_type='list') #['your', 'list', 'here']
Peter Mortensen
25 июля 2021 в 21:06
1

Что означает "rad" в "which is rad" ? rad - «1. (сленг) Отсечение радикала; отлично»

avatar
britodfbr
10 марта 2018 в 15:52
52

На самом деле это можно сделать так:

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'
Bart
2 мая 2018 в 10:06
7

Нет, этот ответ действительно ничего не добавляет к существующим ответам

miike3459
21 апреля 2019 в 16:46
1

Это следует удалить, это дубликат других ответов. str.format - просто модное дополнение.

noobninja
10 мая 2020 в 18:41
0

>>> import os, pprint; pprint.pprint(list(os.environ.items()))

Noumenon
4 августа 2021 в 22:55
0

Первый ответ с читаемым выводом для всего env, спасибо. Чтобы просмотреть env в отладчике PyCharm, я оцениваю {k: v for k,v in sorted(os.environ.items())}

avatar
Azorian
28 марта 2017 в 15:46
28
import os
for a in os.environ:
    print('Var: ', a, 'Value: ', os.getenv(a))
print("all done")

Это напечатает все переменные среды вместе с их значениями.

avatar
Renjith Thankachan
10 января 2017 в 04:12
21

Если вы планируете использовать код в коде производственного веб-приложения, используя любую веб-платформу, например Django и Flask, используйте такие проекты, как . Используя его, вы можете прочитать значение как определенный вами тип.

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 оставался закрытым (недоступным для всех).

avatar
lgriffiths
12 июля 2012 в 08:14
290

Чтобы проверить, существует ли ключ (возвращает True или False)

'HOME' in os.environ

Вы также можете использовать get() при печати ключа; полезно, если вы хотите использовать значение по умолчанию.

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

, где /home/username/ - значение по умолчанию

endolith
3 февраля 2017 в 16:11
4

Что лучше: "HOME" in os.environ или os.environ.get('HOME')?

Trenton
13 февраля 2018 в 22:38
14

@endolith Они делают разные вещи. Первый возвращает True или False, а второй возвращает значение, возможно, None.

Konstantin Sekeresh
16 октября 2019 в 13:43
3

@endolith, правильный вопрос: "HOME" in os.environ vs os.environ.get('HOME') is None. Как видите, первое гораздо более читабельно и с ним удобно работать.

avatar
Scott C Wilson
29 марта 2012 в 13:58
69

Первоначальный вопрос (первая часть) был «как проверить переменные среды в Python».

Вот как проверить, установлен ли $ FOO:

try:  
   os.environ["FOO"]
except KeyError: 
   print "Please set the environment variable FOO"
   sys.exit(1)
RandomInsano
5 февраля 2017 в 16:49
5

Попробовать можно быстрее. Случай env vars, вероятно, лучше всего подходит для 'try': coderhelper.com/a/1835844/187769

Dangercrow
13 октября 2017 в 13:27
21

@RandomInsano быстрее = / = лучше. Этот код выглядит менее читабельным, чем блок "if 'FOO' not in os.environ: ...".

avatar
Jim Brissom
5 февраля 2011 в 13:07
32

Что касается переменных среды:

import os
print os.environ["HOME"]
avatar
andrei1089
5 февраля 2011 в 13:07
55

Вы можете получить доступ к переменным среды, используя

import os
print os.environ

Попробуйте просмотреть содержимое переменных среды PYTHONPATH или PYTHONHOME. Возможно, это будет полезно для вашего второго вопроса.