Можно ли установить переменную окружения из Python навсегда?

С помощью os Модуль я могу получить значения переменных среды. Например:

os.environ['HOME']

Однако я не могу установить переменные среды:

os.environ['BLA'] = "FOO"

Это работает в текущем сеансе программы, но когда я завершаю программу Python, я не вижу, чтобы она изменила (или установила) значения переменных среды. Есть ли способ сделать это из Python?

6 ответов

Если вы хотите, чтобы переменные окружения сохранялись во время сеансов, вы можете

Для unix

делать то, что мы делаем, когда в bash ракушка. Добавить переменные среды внутри ~/.bashrc,

import os
with open(os.path.expanduser("~/.bashrc"), "a") as outfile:
    # 'a' stands for "append"  
    outfile.write("export MYVAR=MYVALUE")

или для Windows:

setx /M MYVAR "MYVALUE"

в *.bat то есть в автозагрузке в программных файлах

если вы хотите сделать это и установить их навсегда в учетную запись пользователя, вы можете использовать setx, но если вы хотите использовать как глобальный, вы можете использовать setx /M, но для этого вам может потребоваться повышение (я использую окна в качестве примера (для linux вы можете использовать экспорт )

      import subprocess
if os.name == 'posix':  # if is in linux
    exp = 'export hi2="youAsWell"'
if os.name == 'nt':  # if is in windows
    exp = 'setx hi2 "youAsWell"'
subprocess.Popen(exp, shell=True).wait()

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

Ответ @rantanplan правильный. Однако для Unix , если вы хотите установить несколько переменных среды, я предлагаю вам добавить \n в конце outfile строка следующим образом:

      outfile.write("export MYVAR=MYVALUE\n")

Итак, код выглядит следующим образом:

      import os
with open(os.path.expanduser("~/.bashrc"), "a") as outfile:
    # 'a' stands for "append"  
    outfile.write("export MYVAR1=MYVALUE1\n")
    outfile.write("export MYVAR2=MYVALUE2\n")

Это предотвратит добавление слова «экспорт» в конце значения переменной среды.

Я не уверен. Вы можете вернуть переменную и установить ее таким образом. Для этого распечатайте его.

(программа на питоне)

...
print foo

(Баш)

set -- $(python test.py)
foo=$1

вы можете использовать py-setenv для выполнения этой работы. Он получит доступ к реестру Windows и внесет изменения за вас, установит через python -m pip install py-setenv

Хорошим решением для людей, желающих применить это решение для Windows, может быть следующее:

Для конкретного пользователя,

      from os import path
with open(path.join(path.expanduser('~'),"AppData","Roaming","Microsoft","Windows"
                    ,"Start Menu","Programs","Startup","script.ps1"), 'w') as fp:
        fp.write('[Environment]::SetEnvironmentVariable("THIS_IS_NAME", "THIS_IS_VALUE", "User") ')

Обратитесь к команде , которая выполняется для заданной среды. ликбез, если есть опечатки ;)

Другие вопросы по тегам