Установка переменных среды из скрипта python

Я использую c-shell и привык использовать setenv. Мне нужно выполнить эквивалентную команду из скрипта Python. Я попытался использовать os.environ['JAVA_HOME'] = "/usr/local/java", который работает из интерпретатора python, но когда мой скрипт выполняется из командной строки, оболочка, в которой он выполнялся, отражает недавно установленную переменную среды . Может ли кто-нибудь помочь, я новичок в написании сценариев, надеюсь, я ясно изложил свой вопрос.


person smuggledPancakes    schedule 13.12.2011    source источник
comment
Дубликат stackoverflow. com/questions/1506010/ ?   -  person Ski    schedule 14.12.2011


Ответы (3)


Если вы используете subprocess.Popen, должно быть достаточно передать env параметр конструктора на все, что вам нужно в качестве словаря (вы можете скопировать содержимое os.environ и добавить свои собственные переменные среды, если хотите).

person jcollado    schedule 13.12.2011

Как описано в Как использовать экспорт с Python в Linux, установка переменной среды в каком-либо процессе (например, в вашем сценарии Python) не может повлиять на какие-либо родительские процессы (например, в процессе csh, из которого вы выполняете сценарий Python).

Что вы можете сделать, так это заставить ваш скрипт Python напечатать команду setenv, а затем оценить вывод в вашей оболочке как команду.

Например:

csh% cat foo.py
#!/usr/bin/python

import os;

os.environ["JAVA_HOME"] = "/usr/local/java"

print "setenv JAVA_HOME", os.environ["JAVA_HOME"]
csh% ./foo.py
setenv JAVA_HOME /usr/local/java
csh% echo $JAVA_HOME 
JAVA_HOME: Undefined variable.
csh% eval `./foo.py` 
csh% echo $JAVA_HOME 
/usr/local/java
csh% 

И вы можете настроить псевдоним в своем ~/.cshrc для выполнения eval `...` или просто вызвать его непосредственно из вашего .cshrc или .login (в зависимости от того, что вы пытаетесь выполнить).

person Keith Thompson    schedule 13.12.2011

Я знаю, что это было давно, но я решил это немного по-другому. Возможно, это даже не самое красивое решение, но оно работает.

Я создал сценарий оболочки с именем env.sh

#!/bin/tcsh
eval $*

Then in my python script called subprocess.

output = subprocess.Popen(["env.sh", "setenv", "DISPLAY", "remhost:0"], stdout = subprocess.PIPE).communicate()[0].split()

Это работает для меня, не забудьте сделать исполняемый файл env.sh, выполнив «chmod +x env.sh»

person Eric Noort    schedule 20.08.2013
comment
Забавно, что вы на самом деле называете его env.sh, а оно начинается с #!/bin/tcsh. - person Danosaure; 16.09.2013