exibite777
@exibite777
Ведущий системный аналитик

Как в python редактировать системные переменные Windows или переменные текущего пользователя?

По началу может показаться что вот так:
os.environ['DEBUG']='FALSE'
os.environ.get('DEBUG')
del os.environ.get('DEBUG')

Но если присмотреться, то можно понять, что это все таки переменные среды Python. Так как через "Панель управления" --> "Свойства системы" --> "Переменные среды" их не видно. Так как все таки получить доступ к системным переменным или переменным пользователя?

Примечание: что хочу сделать - запускаю некий скрипт (условно test.py), который имеет CLI командами вида:
python test.py --no-debug initdb
python test.py --debug initd

А далее ввод ключей "--debug" и "--no-debug" по условия ТЗ вводится не должен. Должно подхватывать с переменной

Само CLI примерно такое (куски с переменной)
if "DEBUG" not in os.environ:
    os.environ["DEBUG"] = "FALSE"
    print('debug mode is off')
def logging(s):
    if s=='FALSE': return False
    if s=='TRUE': return True

@click.group()
@click.option('--no-debug', is_flag=True)
@click.option('--debug', is_flag=True)
def main(no_debug, debug):
    if no_debug: 
        os.environ["DEBUG"] = "FALSE"
        print('debug mode is off')
    if debug: 
        os.environ["DEBUG"] = "TRUE"
        print('debug mode is on')

@click.command()
@click.option('--name')
def initdb(name):
---------------------------------
    if logging(os.environ.get('DEBUG')): 
        log.write(f'initialization {name} database....\n')

@click.command()
@click.option('--name')
def dropdb(name):
---------------------------------
    if logging(os.environ.get('DEBUG')): 
        log.write(f'dropping {name} database....\n')


Но видимо так как интерпретатор на каждый сеанс запускается заново, то его переменные теряются, поэтому и нужны системные
  • Вопрос задан
  • 518 просмотров
Решения вопроса 1
exibite777
@exibite777 Автор вопроса
Ведущий системный аналитик
Вопрос собственно и заключался в том как на уровне процесса создавать и редактировать переменные окружения уровня пользователя или системы?

update Нашел ответ сам. Переменные окружения это ключи в реестре:
Переменные системы HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment
Переменные текущего пользователя HKEY_CURRENT_USER\Environment
Пример:
key=winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Environment")
winreg.SetValueEx(key, "DEBUG", 0, winreg.REG_SZ, "FALSE")
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Переменные окружения имеют иерархические области видимости:
Система
  Пользователь
    Сеанс
       Процесс

Переменные установленные в родительских областях видны для дочерних, но не наоборот. В частности, если процесс устанавливает переменную окружения, она будет иметь установленное значение только для этого процесса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы