Я использую c-shell и привык использовать setenv. Мне нужно выполнить эквивалентную команду из скрипта Python. Я попытался использовать os.environ['JAVA_HOME'] = "/usr/local/java", который работает из интерпретатора python, но когда мой скрипт выполняется из командной строки, оболочка, в которой он выполнялся, отражает недавно установленную переменную среды . Может ли кто-нибудь помочь, я новичок в написании сценариев, надеюсь, я ясно изложил свой вопрос.
Установка переменных среды из скрипта python
Ответы (3)
Если вы используете subprocess.Popen
, должно быть достаточно передать env
параметр конструктора на все, что вам нужно в качестве словаря (вы можете скопировать содержимое os.environ
и добавить свои собственные переменные среды, если хотите).
Как описано в Как использовать экспорт с 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
(в зависимости от того, что вы пытаетесь выполнить).
Я знаю, что это было давно, но я решил это немного по-другому. Возможно, это даже не самое красивое решение, но оно работает.
Я создал сценарий оболочки с именем 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»
env.sh
, а оно начинается с #!/bin/tcsh
.
- person Danosaure; 16.09.2013