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

<p>мне нужно установить некоторые переменные среды в скрипте python, и я хочу, чтобы все остальные скрипты, которые вызываются из python (сценарии оболочки), будут дочерним процессом, чтобы увидеть установленные переменные среды , значение является числом.</p><p>если я делаю <code>os.environ["debussy"] = 1</code>, он жалуется, говоря, что <code>1</code> должен быть строкой. я также хочу знать, как читать переменные окружения в python (в более поздней части скрипта), как только я его установлю.</p>

<p>переменные среды должны быть строками, поэтому используйте</p><pre><code>os.environ["debussy"] = "1" </code></pre><p>установить переменную <code>debussy</code> в строку <code>1</code>.</p><p>чтобы получить доступ к этой переменной позже, просто используйте:</p><pre><code>print(os.environ["debussy"]) </code></pre><p>дочерние процессы автоматически наследуют переменные среды родительского процесса - никаких специальных действий с вашей стороны не требуется.</p>

<p>возможно, вам придется рассмотреть некоторые дополнительные аспекты надежности кода;</p><p>когда вы сохраняете целочисленную переменную как переменную окружения, попробуйте</p><pre><code>os.environ['debussy'] = str(myintvariable) </code></pre><p>затем для извлечения учтите, что во избежание ошибок следует попробовать</p><pre><code>os.environ.get('debussy', 'not set') </code></pre><p>возможно заменить -1 на "не установлено"</p><p>так что, чтобы положить все это вместе</p><pre><code>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) </code></pre>

<p><code>os.environ</code> ведет себя как словарь python, поэтому можно выполнять все обычные словарные операции. в дополнение к операциям <code>get</code> и <code>set</code>, упомянутым в других ответах, мы также можем просто проверить, существует ли ключ</p><p><strong> python 2 </strong></p><pre><code>>>> 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' </code></pre><p><strong> python 3 </strong></p><p>для python 3 словари используют ключевое слово <em> in </em> вместо <em> has\_key </em></p><pre><code>>>> import os >>> 'home' in os.environ # check an existing env. variable true ... </code></pre><p>при использовании <code>os.environ</code> следует отметить одну важную вещь:</p><p>хотя дочерние процессы наследуют среду от родительского процесса, я недавно столкнулся с проблемой и выяснил, если у вас есть другие сценарии, обновляющие среду во время работы вашего сценария python, снова вызывающий <code>os.environ</code> <strong> не будет отражать последние значения </strong>.</p><p>выдержка из <a href="https://docs.python.org/2/library/os.html#os.environ">документов</a> :</p><blockquote> <p>это сопоставление фиксируется при первом импорте модуля os, обычно во время запуска python как части обработки site.py. изменения в среде, сделанные после этого времени, не отражаются в os.environ, за исключением изменений, внесенных путем непосредственного изменения os.environ.</p> </blockquote><p><code>os.environ.data</code>, который хранит все переменные окружения, является объектом dict, который содержит все значения окружения:</p><pre><code>>>> type(os.environ.data) # changed to \_data since v3.2 (refer comment below) <type 'dict'> </code></pre>

<blockquote> <p>если я делаю os.environ ["debussy"] = 1, он жалуется, говоря, что 1 должен быть строкой.</p> </blockquote><p>тогда делай</p><pre><code>os.environ["debussy"] = "1" </code></pre><blockquote> <p>я также хочу знать, как читать переменные окружения в python (в более поздней части скрипта), как только я его установлю.</p> </blockquote><p>просто используйте <code>os.environ["debussy"]</code>, как в</p><pre><code>some\_value = os.environ["debussy"] </code></pre>

<p>вам следует присвоить строковое значение переменной среды.</p><p><code>os.environ["debussy"] = "1"</code></p><p>если вы хотите прочитать или распечатать переменную окружения, просто используйте</p><p><code>print os.environ["debussy"]</code></p><p>эти изменения вступят в силу только для текущего процесса, которому он был назначен, и не изменит значение навсегда. дочерние процессы автоматически наследуют среду родительского процесса.</p><p> <a href="https://i.stack.imgur.com/ihzb3.png"><img src="https://i.stack.imgur.com/ihzb3.png" alt="enter image description here"></a> </p>

<p>а как насчет <code>os.environ["debussy"] = '1'</code>? переменные среды всегда являются строками.</p>

<p>установить переменную:</p><p><strong>метод назначения элемента с использованием ключа:</strong></p><pre><code>import os os.environ['debussy'] = '1' #environ variable must be string not int </code></pre><p>получить или проверить, существует ли он или нет,</p><p>так как <strong>os.environ</strong> это экземпляр, который вы можете попробовать способом объекта.</p><p><strong>метод 1:</strong></p><pre><code>os.environ.get('debussy') # this is error free method if not will return none by default </code></pre><p>получит <code>'1'</code> в качестве возвращаемого значения</p><p><strong>метод 2:</strong></p><pre><code>os.environ['debussy'] # will throw an key error if not found! </code></pre><p><strong>метод 3:</strong></p><pre><code>'debussy' in os.environ # will return boolean true/false </code></pre><p><strong>метод 4:</strong></p><pre><code>os.environ.has\_key('debussy') #last 2 methods are boolean return so can use for conditional statements </code></pre>

<p>вы можете использовать словарь <code>os.environ</code> для доступа к переменным среды.</p><p>теперь проблема, с которой я столкнулся, заключается в том, что если бы я попытался использовать <code>os.system</code> для запуска пакетного файла, который устанавливает переменные среды (используя команду set в файле **. bat *), он не установил бы их для вашего python среда (но для дочернего процесса, который создается с помощью функции <code>os.system</code>). чтобы получить переменные, установленные в среде python, я использую этот скрипт:</p><pre><code>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 </code></pre>

<p>когда вы играете с переменными среды (добавляете/модифицируете/удаляете переменные), хорошей практикой является восстановление предыдущего состояния при завершении функции.</p><p>вам может понадобиться что-то вроде менеджера контекста <code>modified\_environ</code>, описанного в этом <a href="https://stackoverflow.com/a/34333710/1513933">вопрос</a> , чтобы восстановить переменные среды.</p><p>классическое использование:</p><pre><code>with modified\_environ(debussy="1"): call\_my\_function() </code></pre>