Измените переменную среды `PATH` глобально и навсегда, используя Python - PullRequest
0 голосов
/ 27 октября 2011

Можно ли изменить переменную среды PATH глобально и навсегда, независимо от платформы, используя Python (distutils)?

Фон

У меня есть какое-то приложение (плагин)для Serna XML Editor), и теперь я собираюсь сделать для него установщик, возможно, с использованием python distutils (setup.py).После установки setup.py необходимо изменить переменную среды PATH, чтобы добавить каталог установки к ее значению.

Возможное решение для достижения того, чего я хочу, - это скопировать исполняемые файлы в /usr/local/bin или куда-то еще,но для MS Windows не очевидно, куда копировать execs.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Насколько я знаю, distutils не имеет кроссплатформенной утилиты для постоянного изменения переменных среды.Поэтому вам придется писать код, специфичный для платформы.

В Windows переменные среды хранятся в реестре.Это пример кода для чтения и установки некоторых его ключей.Для этого я использую только стандартную библиотеку (не нужно устанавливать pywin32!).

import _winreg as winreg
import ctypes

ENV_HTTP_PROXY = u'http://87.254.212.121:8080'


class Registry(object):
    def __init__(self, key_location, key_path):
        self.reg_key = winreg.OpenKey(key_location, key_path, 0, winreg.KEY_ALL_ACCESS)

    def set_key(self, name, value):
        try:
            _, reg_type = winreg.QueryValueEx(self.reg_key, name)
        except WindowsError:
            # If the value does not exists yet, we (guess) use a string as the
            # reg_type
            reg_type = winreg.REG_SZ
        winreg.SetValueEx(self.reg_key, name, 0, reg_type, value)

    def delete_key(self, name):
        try:
            winreg.DeleteValue(self.reg_key, name)
        except WindowsError:
            # Ignores if the key value doesn't exists
            pass



class EnvironmentVariables(Registry):
    """
    Configures the HTTP_PROXY environment variable, it's used by the PIP proxy
    """

    def __init__(self):
        super(EnvironmentVariables, self).__init__(winreg.HKEY_LOCAL_MACHINE,
                                                   r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment')

    def on(self):
        self.set_key('HTTP_PROXY', ENV_HTTP_PROXY)
        self.refresh()

    def off(self):
        self.delete_key('HTTP_PROXY')
        self.refresh()

    def refresh(self):
        HWND_BROADCAST = 0xFFFF
        WM_SETTINGCHANGE = 0x1A

        SMTO_ABORTIFHUNG = 0x0002

        result = ctypes.c_long()
        SendMessageTimeoutW = ctypes.windll.user32.SendMessageTimeoutW
        SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, u'Environment', SMTO_ABORTIFHUNG, 5000, ctypes.byref(result));

Это всего лишь пример кода, с которого можно начать, он только реализует настройки и удаляет ключи.

Убедитесь, что вы всегда вызываете метод обновления после изменения реестра.Это скажет Windows, что что-то изменилось, и обновит параметры реестра.

Вот ссылка на полное приложение, которое я написал, это переключатель прокси для Windows: https://bitbucket.org/canassa/switch-proxy/

0 голосов
/ 28 октября 2011

Distutils не устанавливает переменные окружения.В Windows это означало бы взломать реестр;в UNIX потребуется найти правильный файл конфигурации оболочки (который не является тривиальным) и отредактировать его, чего в этой культуре просто нет: людям говорят отредактировать их $ PATH или использовать полный путь к программам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...