Установка переменных окружения из скрипта Python - PullRequest
1 голос
/ 14 декабря 2011

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

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

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

1 голос
/ 14 декабря 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 (в зависимости от того, что вы пытаетесь выполнить).

0 голосов
/ 20 августа 2013

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

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

</p> <pre><code>#!/bin/tcsh eval $*

Тогда в моем скрипте на python называется подпроцесс. </p> <pre><code>output = subprocess.Popen(["env.sh", "setenv", "DISPLAY", "remhost:0"], stdout = subprocess.PIPE).communicate()[0].split()

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

...