2011-12-13 4 views
1

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

+2

дубликата http://stackoverflow.com/questions/1506010/how -to-use-export-with-python-on-linux? – Ski

ответ

2

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

1

Как объясняется в How to use export with Python on 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 (в зависимости от того, что вы пытаетесь достичь).

0

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

Я создал скрипт под названием env.sh

#!/bin/tcsh 
eval $* 

Тогда в моем питона сценарий под названием подпроцесс.

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

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

+0

Просто смешно, что вы на самом деле называете его 'env.sh', и он начинается с' #!/Bin/tcsh'. – Danosaure

Смежные вопросы