Как сделать, чтобы переменные среды оставались в Python? - PullRequest
18 голосов
/ 28 января 2009

Из того, что я прочитал, любые изменения переменных среды в экземпляре Python доступны только в этом экземпляре и исчезают после закрытия экземпляра. Есть ли способ заставить их придерживаться, передав их в систему?

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

Мой тестовый код

import os
os.environ['FAKE'] = 'C:\\'

Открытие другого экземпляра Python и запрос os.environ['FAKE'] приводит к KeyError.

ПРИМЕЧАНИЕ: Проблемой будет переносимость, но небольшой API, который я пишу, сможет проверять версию ОС и запускать различные команды при необходимости.

Тем не менее, я пошел по пути использования техники реестра Windows и просто напишу альтернативные методы, которые будут вызывать сценарии оболочки на других платформах, когда они становятся требованиями.

Ответы [ 11 ]

9 голосов
/ 28 января 2009

заставить их придерживаться, совершая их система?

Я думаю, вы здесь немного запутались. Нет «системной» среды. Каждый процесс имеет свою собственную среду как часть своей памяти. Процесс может изменить только свою среду. Процесс может установить начальную среду для процессов, которые он создает.

Если вы действительно думаете, что вам нужно установить переменные окружения для системы, вам нужно посмотреть, как они изменяются в том месте, откуда они изначально загружаются, например, из реестра в Windows или в файле конфигурации вашей оболочки в Linux.

8 голосов
/ 17 августа 2013

Вы можете использовать SETX в командной строке.

По умолчанию эти действия выполняются в переменных USER env. Для установки и изменения переменных SYSTEM используйте флаг / M

import os
env_var = "BUILD_NUMBER"
env_val = "3.1.3.3.7"
os.system("SETX {0} {1} /M".format(env_var,env_val))
7 голосов
/ 28 января 2009

В Windows вы можете вносить изменения в переменные среды, сохраняемые через реестр, с помощью этого рецепта , хотя это выглядит как перебор.

В ответ на вопрос Брайана, что вы пытаетесь достичь? Вероятно, есть более простой способ.

5 голосов
/ 28 января 2009

Я не верю, что вы можете сделать это; я могу придумать два обходных пути.

  1. Функция os.putenv устанавливает среду для процессов, с которых вы запускаете, например, os.system, popen и т. Д. В зависимости от того, что вы пытаетесь сделать, возможно, у вас может быть один главный экземпляр Python, который устанавливает переменная, а затем порождает новые экземпляры.

  2. Вы можете запустить сценарий оболочки или командный файл, чтобы установить его для вас, но это становится гораздо менее переносимым. Смотрите эту статью:

http://code.activestate.com/recipes/159462/

3 голосов
/ 29 января 2009

Думайте об этом так.

Вы не устанавливаете переменные среды оболочки.

Вы порождаете подоболочку с некоторыми заданными настройками переменных среды; эта подоболочка запускает ваше приложение с измененной средой.

3 голосов
/ 28 января 2009

Согласно этой дискуссии , вы не можете этого сделать. Что вы пытаетесь достичь?

2 голосов
/ 16 марта 2016

Похоже, есть более простое решение для Windows

import subprocess 
subprocess.call(['setx', 'Hello', 'World!'], shell=True)
2 голосов
/ 28 января 2009

Вы создаете новый процесс и не можете изменить среду родительского процесса, как вы не можете этого сделать, если запускаете новый процесс оболочки из оболочки

1 голос
/ 28 января 2009

Возможно, вы захотите попробовать Python Win32 Extensions , разработанный Марком Хаммондом, который включен в ActivePython (или может быть установлен отдельно). Вы можете научиться выполнять множество задач, связанных с Windows, в книге Хаммонда и Робинсона .

Используя PyWin32 для доступа к окнам COM-объекты , программа Python может использовать Свойство среды (набор переменных среды) объекта WScript.Shell .

0 голосов
/ 17 июля 2016

На случай, если кому-то может понадобиться эта информация. Я понимаю, что это спросили 7 лет назад, но даже я забываю, как иногда. .

Да, есть способ заставить их "прилипать" к окнам. Просто зайдите в панель управления, систему, дополнительные настройки системы, когда откроется окно свойств системы, вы увидите опцию (кнопка) для переменных среды. . Процесс получения этой информации немного отличается в зависимости от того, какую ОС вы используете (Google google).

Выберите это (нажмите кнопку), после чего откроется окно «Переменные среды». У этого есть 2 разделенных окна, верхнее должно быть вашими "Пользовательскими переменными для вашего имени пользователя". , . Выберите «new», затем просто установите переменную. Например, один из моих "Database_Password = mypassword".

Тогда в вашем приложении вы можете получить к ним доступ следующим образом: import os, os.environ.get ('Database_Password'). Вы можете сделать что-то вроде pass = os.environ.get('Database_Password').

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