???????? ???????????????? ?? ????????

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

Программы, software, hardware, warez, cracks и все что с этим связано.

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

Сообщение Puppet » Пн дек 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

Нужны инстурменты для создания, редактирования и удаления переменных.
Pavel Ledin aka Puppet
TD, Trehmer
Puppet
Частый гость
 
Сообщения: 98
Зарегистрирован: Пн ноя 03, 2003 23:35 pm


Сообщение wiz » Пн дек 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')


Где-то рядом лежит и для записи...
Стакан пустоты наполовину пессимист.
Аватара пользователя
wiz
Спец юзер
 
Сообщения: 782
Зарегистрирован: Пт авг 27, 2004 12:21 pm
Откуда: Aenor Realm

Сообщение wiz » Пн дек 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/
Стакан пустоты наполовину пессимист.
Аватара пользователя
wiz
Спец юзер
 
Сообщения: 782
Зарегистрирован: Пт авг 27, 2004 12:21 pm
Откуда: Aenor Realm

Сообщение Puppet » Вт дек 05, 2006 17:08 pm

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

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

Я случайно наткнулся на нечто похожее _winreg, вроде функциональность та же.
Думаю дальше сам разбирусь. Спасиб.
Pavel Ledin aka Puppet
TD, Trehmer
Puppet
Частый гость
 
Сообщения: 98
Зарегистрирован: Пн ноя 03, 2003 23:35 pm

Сообщение wiz » Ср дек 06, 2006 1:13 am

Есть модуль ctypes (в 2.5 вошедший в базовую поставку) который позволяет вызывать содержимое .dll напрямую.
Тоесть можно глянуть API и сделать прямо по нему - импортировать и запускать.
Стакан пустоты наполовину пессимист.
Аватара пользователя
wiz
Спец юзер
 
Сообщения: 782
Зарегистрирован: Пт авг 27, 2004 12:21 pm
Откуда: Aenor Realm

Сообщение Puppet » Ср дек 06, 2006 13:57 pm

Хм, что то я не совсем пойму, а чем мне это поможет, ведь самой библиотеки у меня нет...
Я вроде все уже написал с помощью _winreg, вроде все работает как надо. Спасибо.
Pavel Ledin aka Puppet
TD, Trehmer
Puppet
Частый гость
 
Сообщения: 98
Зарегистрирован: Пн ноя 03, 2003 23:35 pm

Сообщение wiz » Чт дек 07, 2006 1:39 am

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

Сама библиотека это win.dll (или где там венда функции реестра держит..) и её можно подгрузить через ctypes.
Стакан пустоты наполовину пессимист.
Аватара пользователя
wiz
Спец юзер
 
Сообщения: 782
Зарегистрирован: Пт авг 27, 2004 12:21 pm
Откуда: Aenor Realm

Сообщение Puppet » Сб дек 09, 2006 20:39 pm

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

Но тут еще вопрос...
После выставления переменных, в частности после SetValueEx() переменные выставляются, но не работают пока не зайдешь в 'переменые окружения' в винде и просто не нажмешь OK.
Кто нибудь знает как "перезачитать" реест?
Подходящих функций для этого не нашел.
Pavel Ledin aka Puppet
TD, Trehmer
Puppet
Частый гость
 
Сообщения: 98
Зарегистрирован: Пн ноя 03, 2003 23:35 pm

Сообщение wiz » Вс дек 10, 2006 17:29 pm

Вот http://support.microsoft.com/kb/q104011/ как раз про это.
Стакан пустоты наполовину пессимист.
Аватара пользователя
wiz
Спец юзер
 
Сообщения: 782
Зарегистрирован: Пт авг 27, 2004 12:21 pm
Откуда: Aenor Realm

Сообщение Puppet » Вс дек 10, 2006 21:25 pm

Еще раз спасибо.
Но это код на си, хотя мне стала ясна схема как оно работает, это навело меня на одну идею...
Pavel Ledin aka Puppet
TD, Trehmer
Puppet
Частый гость
 
Сообщения: 98
Зарегистрирован: Пн ноя 03, 2003 23:35 pm

Сообщение wiz » Пн дек 11, 2006 3:55 am

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

Этот код на си лежит в вендовых dll-ках, которые можно вызвать через (сюрприз!) ctypes (;
Стакан пустоты наполовину пессимист.
Аватара пользователя
wiz
Спец юзер
 
Сообщения: 782
Зарегистрирован: Пт авг 27, 2004 12:21 pm
Откуда: Aenor Realm


Вернуться в Сети, программы и железо

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron
Яндекс.Метрика