vbloodv
@vbloodv
Программист С++

Как используя Python изменить системную переменную %PATH% (windows)?

Хочу использовать искрипт на питон чтобы добавлять в конец этой переменный свои директории, но из-за того что сам питон тоже надо прописать в path гугл выдает ответы не нужные мне... Подскажите как это могу сделать или погуглите за меня с предоставлением ссылочки, если я этому не научился за годы жизни (((
  • Вопрос задан
  • 5269 просмотров
Решения вопроса 1
@Heafy
import os

cmd = 'wmic environment where name="PATH" set variablevalue="C:\Temp;%PATH%'
os.system(cmd)

python 3.4
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vbloodv
@vbloodv Автор вопроса
Программист С++
Очень лаконичное решение, то которое нашел я гораздо тяжелее, спасибо !
# -*- coding: utf-8 -*-
import sys
from subprocess import check_call

if sys.hexversion > 0x03000000:
    import winreg
else:
    import _winreg as winreg


class Win32Environment:
    """Utility class to get/set windows environment variable"""

    def __init__(self, scope):
        assert scope in ('user', 'system')
        self.scope = scope
        if scope == 'user':
            self.root = winreg.HKEY_CURRENT_USER
            self.subkey = 'Environment'
        else:
            self.root = winreg.HKEY_LOCAL_MACHINE
            self.subkey = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'

    def getenv(self, name):
        key = winreg.OpenKey(self.root, self.subkey, 0, winreg.KEY_READ)
        try:
            value, _ = winreg.QueryValueEx(key, name)
        except WindowsError:
            value = ''
        return value

    def setenv(self, name, value):
        # Note: for 'system' scope, you must run this as Administrator
        key = winreg.OpenKey(self.root, self.subkey, 0, winreg.KEY_ALL_ACCESS)
        winreg.SetValueEx(key, name, 0, winreg.REG_EXPAND_SZ, value)
        winreg.CloseKey(key)
        # For some strange reason, calling SendMessage from the current process
        # doesn't propagate environment changes at all.
        # TODO: handle CalledProcessError (for assert)
        check_call('''\
"%s" -c "import win32api, win32con; assert win32api.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')"''' % sys.executable)


if __name__ == "__add_to_winpath_":
    e1 = Win32Environment(scope="system")
    print(e1.getenv('PATH'))
    name = "d:\workspace\ndk\android-ndk-r9d\"
    e1.setenv('PATH', e1.getenv('PATH') + ';' + name)
    print(e1.getenv('PATH'))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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