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')


Но видимо так как интерпретатор на каждый сеанс запускается заново, то его переменные теряются, поэтому и нужны системные
  • Вопрос задан
  • 468 просмотров
Решения вопроса 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
Седой и строгий
Переменные окружения имеют иерархические области видимости:
Система
  Пользователь
    Сеанс
       Процесс

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

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

Войти через центр авторизации
Похожие вопросы