2017-01-31 9 views
1

Чтобы установить переменную окружения с помощью командной строки Windows, процессор (cmd):Как хранить переменные среды

SET MY_VARIABLE=c:\path\to\filename.txt 

MY_VARIABLE теперь могут быть доступны приложения Python начатой ​​же cmd окна:

import os 
variable = os.getenv('MY_VARIABLE') 

I интересно, есть ли способ установить переменную среды изнутри Python, чтобы она стала доступной для других процессов, запущенных на одной машине? Чтобы установить новую переменную окружения:

os.environ['NEW_VARIABLE'] = 'NEW VALUE' 

Но это NEW_VARIABLE теряется, как только процесс Python и вышел.

+0

Если ваш скрипт Python * запускает * эти другие процессы, тривиально и портативно. Если между родительскими и дочерними отношениями нет ... ну, вы можете сохранить их в реестре Windows, чтобы они были настроены для других процессов во время запуска, если это то, что вы хотите, но вы, вероятно, должны пометить свой вопрос как специфичный для Windows в этом дело. –

+2

Когда процесс обновляет переменные среды, хранящиеся в реестре, он должен транслировать сообщение «Среда окружения» WM_SETTINGCHANGE, чтобы сообщить «Проводнику» перезагрузить переменные среды. Любой другой процесс с окном верхнего уровня, который должен слушать, может сделать то же самое, когда видит это сообщение. Консольные процессы, такие как cmd.exe, обычно не имеют окна (консольное окно принадлежит conhost.exe), поэтому они обычно не получают это сообщение. – eryksun

ответ

2

Вы можете хранить переменные окружения постоянно в реестре Windows. Переменные могут быть сохранены для текущего пользователя или для системы:

Код настойчиво установить переменную окружения на Windows:

import win32con 
import win32gui 
try: 
    import _winreg as winreg 
except ImportError: 
    # this has been renamed in python 3 
    import winreg 

def set_environment_variable(variable, value, user_env=True): 
    if user_env: 
     # This is for the user's environment variables 
     reg_key = winreg.OpenKey(
      winreg.HKEY_CURRENT_USER, 
      'Environment', 0, winreg.KEY_SET_VALUE) 
    else: 
     # This is for the system environment variables 
     reg_key = winreg.OpenKey(
      winreg.HKEY_LOCAL_MACHINE, 
      r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 
      0, winreg.KEY_SET_VALUE) 

    if '%' in value: 
     var_type = winreg.REG_EXPAND_SZ 
    else: 
     var_type = winreg.REG_SZ 
    with reg_key: 
     winreg.SetValueEx(reg_key, variable, 0, var_type, value) 

    # notify about environment change  
    win32gui.SendMessageTimeout(
     win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 
     'Environment', win32con.SMTO_ABORTIFHUNG, 1000) 

Тестовый код для вызова выше:

set_environment_variable('NEW_VARIABLE', 'NEW VALUE') 
-3

Простой, если не слегка грубый способ сделать это, просто использовать os.system и передать команду через это, как если бы вы запускали его в CMD?

Примером является os.system("SET MY_VARIABLE=c:\path\to\filename.txt")

Надеется, что helps.`

+1

Это будет абсолютно ничего, кроме отходов. Команда 'SET' влияет только на дочерний процесс, который сразу же выходит. –

+0

Хорошо, ладно. Как я и предлагаю в своем ответе, я был не совсем уверен и не мог в это время проверить, но думал, что это возможно, по крайней мере, указать OP в правильном направлении. – BoshJailey

 Смежные вопросы

  • Нет связанных вопросов^_^