Как установить переменные среды в Python
Мне нужно установить некоторые переменные среды в python script, и мне нужны все остальные сценарии, которые вызывают из python (shell-скрипты), которые будут дочерним процессом, чтобы увидеть переменные окружения. Значение - это число.
Если я делаю os.environ["DEBUSSY"] = 1
, он жалуется, что 1
должен быть строкой.
Я также хочу знать, как читать переменные среды в python (в более поздней части script), как только я его установил.
Ответы
Ответ 1
Переменные среды должны быть строками, поэтому используйте
os.environ["DEBUSSY"] = "1"
установить переменную DEBUSSY
в строку 1
.
Чтобы получить доступ к этой переменной позже, просто используйте:
print(os.environ["DEBUSSY"])
Дочерние процессы автоматически наследуют переменные среды родительского процесса - никаких специальных действий с вашей стороны не требуется.
Ответ 2
Возможно, вам придется рассмотреть некоторые дополнительные аспекты надежности кода;
когда вы храните переменную с целым числом в качестве переменной среды, попробуйте
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)
Ответ 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
не будет отражать последние значения.
Выдержка из документов:
Это отображение фиксируется при первом импорте модуля 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'>
Ответ 4
если я делаю os.environ [ "DEBUSSY" ] = 1, это жалуется, что 1 должен быть строка.
Тогда do
os.environ["DEBUSSY"] = "1"
Я также хочу знать, как читать переменные среды в python (в более поздняя часть script), как только я установил он.
Просто используйте os.environ["DEBUSSY"]
, как в
some_value = os.environ["DEBUSSY"]
Ответ 5
Вы должны присвоить значение переменной переменной окружения.
os.environ["DEBUSSY"] = "1"
Если вы хотите прочитать или распечатать переменную окружения, просто используйте
print os.environ["DEBUSSY"]
Эти изменения будут эффективны только для текущего процесса, когда он был назначен, он не изменит значение навсегда. Детские процессы автоматически наследуют среду родительского процесса.
![введите описание изображения здесь]()
Ответ 6
Как насчет os.environ["DEBUSSY"] = '1'
? Переменные среды всегда являются строками.
Ответ 7
установить переменную:
Метод назначения элемента по ключу:
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
Ответ 8
Вы можете использовать словарь os.environ
для доступа к переменным среды.
Теперь проблема заключалась в том, что если бы я попытался использовать os.system
для запуска командного файла, который задает ваши переменные среды (используя команду SET в файле **. bat *), это на самом деле не установило бы их для ваша среда python (но для дочернего процесса, созданного с помощью функции os.system
). Чтобы фактически получить переменные, заданные в среде python, я использую этот script:
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
Ответ 9
Когда вы играете с переменными окружения (добавьте/измените/удалите переменные), хорошей практикой является восстановление предыдущего состояния при завершении функции.
Вам может понадобиться что-то вроде диспетчера контекста modified_environ
в этом вопросе , чтобы восстановить переменные среды.
Классическое использование:
with modified_environ(DEBUSSY="1"):
call_my_function()
Ответ 10
Следует отметить, что если вы попытаетесь установить переменную окружения для оценки 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)