Switch to full style
Программы, software, hardware, warez, cracks и все что с этим связано.
Ответить

выставление переменных в python

Пн дек 04, 2006 20:16 pm

Подскажите ламиру, как в python можно выставить системную environment variable, не для текущего процесса, а для системы?

Например:
os.environ['MY_ENV_NAME'] = 'some_value'
влияет только на текущий процесс, а нужно для системы.

Ну и второй вопрос, возмоно сразу отпадет когда узнаю ответ на первый :)
как добавить в переменную новое значение, ну тоесть сделать append?

Например в ruby это можно сделать так:
Код:
def append_to_environment(var_name, append_item)
   wmi = WIN32OLE.connect("winmgmts:\\\\.\\root\\cimv2")
   wql = "Select * from Win32_Environment Where Name = '#{var_name}' and
   UserName = '<SYSTEM>'"
   system_path = wmi.ExecQuery(wql)

   system_path.each do |i|
      i.VariableValue += ";#{append_item}"
      i.Put_
     end
end

Нужны инстурменты для создания, редактирования и удаления переменных.

Пн дек 04, 2006 23:05 pm

Нашёл что-то, но проверить не могу - нигде нет вин32.

Это для чтения:
Код:
import os, win32api, win32con

def getenv_system(varname, default=''):
    v = default
    try:
        rkey = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, 'SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment')
        try:
            v = str(win32api.RegQueryValueEx(rkey, varname)[0])
            v = win32api.ExpandEnvironmentStrings(v)
        except:
            pass
    finally:
        win32api.RegCloseKey(rkey)
    return v

print 'SYSTEM.TEMP => %s' % getenv_system('TEMP')
print 'USER.TEMP   => %s' % os.getenv('TEMP')


Где-то рядом лежит и для записи...

Пн дек 04, 2006 23:09 pm

Вот народ работает с окружением:
Код:
>>> key = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE,
       "SYSTEM\CurrentControlSet\Control\Session Manager\Environment",
       0, win32con.KEY_ALL_ACCESS)

>>> print win32api.RegQueryValueEx(key, "CLASSPATH")
('.;%CP_JDK%;%CP_JPYTHON%;%CP_OLEBRIDGE%;%CP_DOCWIZ%;', 2)

>>> win32api.RegSetValueEx(key, "CP_BBB", 0, win32con.REG_SZ, "BBB")

>>> print win32api.RegQueryValueEx(key, "CP_BBB")
('BBB', 1)


Подробности от MS: http://support.microsoft.com/kb/q104011/

Вт дек 05, 2006 17:08 pm

Большое спасибо!

Забавно что в стандартной поставке питона 2.5 под винду нет модулей win32api и win32con.
Более того на сайте питон.орг в списке известных модулей их тоже нет.
Но зато в FAQ есть упоминание про win32api правда всего один раз.
В доке самого питона кстати тоже ничего нет про это.
Может их переименовали и оно теперь как то по другому называется?

Я случайно наткнулся на нечто похожее _winreg, вроде функциональность та же.
Думаю дальше сам разбирусь. Спасиб.

Ср дек 06, 2006 1:13 am

Есть модуль ctypes (в 2.5 вошедший в базовую поставку) который позволяет вызывать содержимое .dll напрямую.
Тоесть можно глянуть API и сделать прямо по нему - импортировать и запускать.

Ср дек 06, 2006 13:57 pm

Хм, что то я не совсем пойму, а чем мне это поможет, ведь самой библиотеки у меня нет...
Я вроде все уже написал с помощью _winreg, вроде все работает как надо. Спасибо.

Чт дек 07, 2006 1:39 am

Puppet писал(а):Хм, что то я не совсем пойму, а чем мне это поможет, ведь самой библиотеки у меня нет...

Сама библиотека это win.dll (или где там венда функции реестра держит..) и её можно подгрузить через ctypes.

Сб дек 09, 2006 20:39 pm

Ага, ясно. Но кажется это вариант с _winreg мне больше подходит, выглядит более правильным :)

Но тут еще вопрос...
После выставления переменных, в частности после SetValueEx() переменные выставляются, но не работают пока не зайдешь в 'переменые окружения' в винде и просто не нажмешь OK.
Кто нибудь знает как "перезачитать" реест?
Подходящих функций для этого не нашел.

Вс дек 10, 2006 17:29 pm

Вот http://support.microsoft.com/kb/q104011/ как раз про это.

Вс дек 10, 2006 21:25 pm

Еще раз спасибо.
Но это код на си, хотя мне стала ясна схема как оно работает, это навело меня на одну идею...

Пн дек 11, 2006 3:55 am

Puppet писал(а):Еще раз спасибо.
Но это код на си, хотя мне стала ясна схема как оно работает, это навело меня на одну идею...

Этот код на си лежит в вендовых dll-ках, которые можно вызвать через (сюрприз!) ctypes (;
Ответить