Как установить переменные среды в Python - PullRequest
495 голосов
/ 12 мая 2011

Мне нужно установить некоторые переменные окружения в скрипте python, и я хочу, чтобы все остальные скрипты, которые вызываются из python (сценарии оболочки), которые будут дочерним процессом, видели набор переменных окружения. Значение является числом.

Если я делаю os.environ["DEBUSSY"] = 1, он жалуется, говоря, что 1 должно быть строкой. Я также хочу знать, как читать переменные окружения в python (в более поздней части скрипта), как только я его установлю.

Ответы [ 10 ]

597 голосов
/ 12 мая 2011

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

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

для установки переменной DEBUSSY в строку 1.

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

print(os.environ["DEBUSSY"])

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

99 голосов
/ 12 мая 2011

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

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

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

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

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

возможно заменить '-1' на 'Не установить'

, чтобы сложить все вместе

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)
43 голосов
/ 19 апреля 2017

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

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'

Python 3

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

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

При использовании os.environ следует отметить одну важную вещь:

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

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

Это отображение фиксируется при первом импорте модуля os, обычно во время запуска 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'>
18 голосов
/ 12 мая 2011

если я сделаю os.environ ["DEBUSSY"] = 1, это жалуется, говоря, что 1 должен быть строка.

Тогда сделай

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

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

Просто используйте os.environ["DEBUSSY"], как в

some_value = os.environ["DEBUSSY"]
16 голосов
/ 06 октября 2016

Вы должны присвоить строковое значение переменной среды.

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

Если вы хотите прочитать или распечатать переменную среды, просто используйте

print os.environ["DEBUSSY"]

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

enter image description here

14 голосов
/ 12 мая 2011

А как насчет os.environ["DEBUSSY"] = '1'?Переменные среды всегда являются строками.

10 голосов
/ 06 апреля 2019

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

позиция Метод назначения с помощью ключа:

import os    
os.environ['DEBUSSY'] = '1'  #Environ Variable must be string not Int

чтобы получить или проверить, существовал он или нет,

, поскольку os.environ - это экземпляр, который вы можете использовать для объекта.

Метод 1:

os.environ.get('DEBUSSY') # this is error free method if not will return None by default

получит '1' в качестве возвращаемого значения

Метод 2:

os.environ['DEBUSSY'] # will throw an key error if not found!

Метод 3:

'DEBUSSY' in os.environ  # will return Boolean True/False

Метод 4:

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements
10 голосов
/ 31 августа 2016

Вы можете использовать словарь os.environ для доступа к переменным среды.

Теперь у меня возникла проблема: если бы я попытался использовать os.system для запуска пакетного файла, который устанавливает переменные среды (используя команду SET в файле **. Bat *), это не было быустановите их для вашей среды Python (но для дочернего процесса, который создается с помощью функции os.system).Чтобы получить переменные, установленные в среде python, я использую этот скрипт:

import re
import system
import os

def setEnvBat(batFilePath, verbose = False):
    SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE)
    SetEnvFile = open(batFilePath, "r")
    SetEnvText = SetEnvFile.read()
    SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText)

    for SetEnvMatch in SetEnvMatchList:
        VarName=SetEnvMatch[0]
        VarValue=SetEnvMatch[1]
        if verbose:
            print "%s=%s"%(VarName,VarValue)
        os.environ[VarName]=VarValue
8 голосов
/ 10 мая 2017

Когда вы играете с переменными среды (добавляете / модифицируете / удаляете переменные), хорошей практикой является восстановление предыдущего состояния при завершении функции.

Вам может понадобиться что-то вроде диспетчера контекста modified_environ, описанного в этом вопросе , для восстановления переменных среды.

Классическое использование:

with modified_environ(DEBUSSY="1"):
    call_my_function()
0 голосов
/ 29 июня 2019

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

from os import environ

environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"

Это не будет оцениваться, как в оболочке, поэтому вместо получения /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home в качестве пути вы получите буквальное выражение $(/usr/libexec/java_home).

Обязательно оцените его перед установкой переменной среды, например:

from os import environ
from subprocess import Popen, PIPE

bash_variable = "$(/usr/libexec/java_home)"
capture = Popen("echo " + bash_variable, stdout=PIPE, shell=True)
std_out, std_err = capture.communicate()
return_code = capture.returncode

if return_code == 0:
    evaluated_env = std_out.decode().strip()
    environ["JAVA_HOME"] = evaluated_env
else:
    print("Error: Unable to find environment variable " + bash_variable)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...