Вопрос-Ответ

How to set environment variables in Python?

Как установить переменные окружения в Python?

Мне нужно установить некоторые переменные окружения в скрипте Python, и я хочу, чтобы все другие скрипты, вызываемые из Python, видели набор переменных окружения.

Если я сделаю,

os.environ["DEBUSSY"] = 1

он жалуется, говоря, что 1 должна быть строка.

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

Переведено автоматически
Ответ 1

Переменные окружения должны быть строками, поэтому используйте

import os
os.environ["DEBUSSY"] = "1"

установить переменную DEBUSSY в строку 1.

Чтобы получить доступ к этой переменной позже, просто используйте

print(os.environ["DEBUSSY"])

Дочерние процессы автоматически наследуют окружение родительского процесса - никаких специальных действий с вашей стороны не требуется.

Ответ 2

Возможно, вам потребуется рассмотреть некоторые дополнительные аспекты для повышения надежности кода;

когда вы сохраняете целочисленную переменную в качестве переменной окружения, попробуйте

os.environ['DEBUSSY'] = str(myintvariable)

затем для извлечения учтите, что во избежание ошибок вам следует попробовать

os.environ.get('DEBUSSY', 'Not Set')

возможно, замените '-1' на 'Not Set'

итак, чтобы собрать все это вместе

myintvariable = 1
os.environ['DEBUSSY'] = str(myintvariable)
strauss = int(os.environ.get('STRAUSS', '-1'))
# NB KeyError <=> strauss = os.environ['STRAUSS']
debussy = int(os.environ.get('DEBUSSY', '-1'))

print "%s %u, %s %u" % ('Strauss', strauss, 'Debussy', debussy)
Ответ 3

os.environ ведет себя как словарь python, поэтому могут выполняться все обычные операции со словарем. В дополнение к get и set операциям, упомянутым в других ответах, мы также можем просто проверить, существует ли ключ. Ключи и значения должны храниться в виде строк.

Python 3

Для python 3 словари используют ключевое слово in вместо has_key

>>> import os
>>> 'HOME' in os.environ # Check an existing env. variable
True
...

Python 2

>>> import os
>>> os.environ.has_key('HOME') # Check an existing env. variable
True
>>> os.environ.has_key('FOO') # Check for a non existing variable
False
>>> os.environ['FOO'] = '1' # Set a new env. variable (String value)
>>> os.environ.has_key('FOO')
True
>>> os.environ.get('FOO') # Retrieve the value
'1'

Есть одна важная вещь, на которую следует обратить внимание при использовании os.environ:

Хотя дочерние процессы наследуют среду от родительского процесса, недавно я столкнулся с проблемой и выяснил, что если у вас есть другие скрипты, обновляющие среду во время выполнения вашего скрипта python, то os.environ повторный вызов не отразит последние значения.

Выдержка из документов:


Это сопоставление фиксируется при первом импорте модуля операционной системы, обычно во время запуска Python как части обработки site.py. Изменения в среде, внесенные по истечении этого времени, не отражаются в os.environ, за исключением изменений, внесенных путем прямой модификации os.environ.


os.environ.data который хранит все переменные окружения, является объектом dict, который содержит все значения окружения:

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>
Ответ 4

Перед использованием этого метода, пожалуйста, ознакомьтесь с разделами комментариев

Я пытался добавить переменные окружения. Моей целью было сохранить некоторую пользовательскую информацию в системных переменных, чтобы я мог использовать эти переменные для будущих решений, в качестве альтернативы файлам конфигурации. Однако метод, описанный в приведенном ниже коде, мне совсем не помог.

import os
os.environ["variable_1"] = "value_1"
os.environ["variable_2"] = "value_2"
# To Verify above code
os.environ.get("variable_1")
os.environ.get("variable_2")

Этот простой блок кода работает хорошо, однако эти переменные существуют внутри соответствующих процессов, так что вы не найдете их на вкладке переменные окружения системных настроек Windows. В значительной степени приведенный выше код не соответствовал моей цели. Эта проблема обсуждается здесь: проблема сохранения переменной

os.environ.putenv(key, value)

Еще одна неудачная попытка. Итак, наконец, мне удалось успешно сохранить переменные внутри регистра среды window, имитируя команды оболочки Windows, заключенные в системный класс пакета os. Следующий код описывает эту успешную попытку.

os.system("SETX {0} {1} /M".format(key, value))

Я надеюсь, что это будет полезно для некоторых из вас.

python