Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > добавить переменное окружение из python


Автор: Wuffur 29.8.2011, 20:46
Собственно, как добавить переменную окружения, и что добавляет, а то sys.path.append добавляет не в переменную окружения path,  а не знаю куда.
Может есть какая-то команда exec(), только я не знаю, чтобы добавить вручную. Или еще проще. А то иногда еще приходится добавлять ссылки на слинкованные библиотеки(.so), то есть выходить из питона и заново входить.
Точно os.putenv(), правда ничего не случается.
Для выполнения команд нашел модуль subprocess функция call.
А добавление sys.path.append - это добавления переменных окружения python`a, вроде.

Может в винде python`у нужны права администратора, чтобы добавлять переменные окружения?

Автор: Backward 30.8.2011, 01:23
sys.path - это список папок, в которых происходит поиск модулей и пакетов Python (т.е. когда в своем скрипте Вы напишите import чего_то_там, то поиск этого самого чего_то_там будет последовательно выполняться сначала в текущей папке, а затем в папках входящих в sys.path)
Для доступа к переменным окружения можно воспользоваться os.environ

Автор: Dagger 30.8.2011, 02:03
в общем по полочкам:
  •  красиво это сделать скучно т.к. управление переменными окружения зависят от текущего shell
  •  если предположить, что текущий шел bash или sh, то вызывать с помощью subprocess
    Код

    call('export %s="%s"' % (env_var_name, env_var_value))

Автор: Wuffur 30.8.2011, 11:26
Цитата(Dagger @ 30.8.2011,  02:03)
в общем по полочкам:

  •  красиво это сделать скучно т.к. управление переменными окружения зависят от текущего shell
  •  если предположить, что текущий шел bash или sh, то вызывать с помощью subprocess
    Код

    call('export %s="%s"' % (env_var_name, env_var_value))


У этой строчки кода 
Код

call('export %s="%s"' % (env_var_name, env_var_value))

Как и у 
Код

 subprocess.Popen('export %s="%s"' % (env_var_name, env_var_value), shell=False)

такая ошибка:
Код

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/subprocess.py", line 595, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.6/subprocess.py", line 1092, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

ее нет, если написать shell=True:
Код

 subprocess.Popen('export %s="%s"' % (env_var_name, env_var_value), shell=True)

но в переменных окружениях ничего не изменяется.
и еще, нужно ли убивать процесс, а то Popen.kill не передает аргументов:
Код

pid =  subprocess.Popen('export %s="%s"' % (env_var_name, env_var_value), shell=Truе).pid



Автор: Wuffur 31.8.2011, 22:38
Нашел решение в винде:
Код

os.environ[env_var_name] = env_var_value;

Если будет работать в linux`e, то тему закрою.

спасибо 
     smile  python.su  smile    и  smile     всем  smile     кто  smile      ответил  smile      в  smile     теме  smile     
!!!
 smile 

os.environ - это большой словарь, но тип у него не dict, а если взять type(os.environ)  получится instance. Посмотрел внутрь, называется userdict, видимо он наследуется от словаря и к нему добавлены еще какие-то функции.
Там написано, что UserDict — Class wrapper for dictionary objects(класс обертка для объектов словарей). (последний багфикс в нем был 5 часов назад smile http://hg.python.org/cpython/file/2.7/Lib/UserDict.py)
можно еще
Код

os.environ.__setitem__(env_var_name,env_var_value)



Автор: Wuffur 1.9.2011, 09:18
Работает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)