2015-10-14 2 views
0

Я хочу установить переменные среды в оболочке, а затем использовать эти переменные в последующих командах; однако использование subprocess.call() в режиме оболочки не позволяет установить переменную среды. Как получить желаемую функциональность через подпроцесс.Переменные окружения, не сохраненные в результате последующих вызовов подпроцесса (Python)

Вот упрощенный пример проблемы у меня возникли:

import subprocess 
#Method 1 
subprocess.call('VARNAME1=\"MyValue1\"', shell=True) 
subprocess.call("echo $VARNAME1", shell=True) 

#Method 2 
subprocess.call('VARNAME2=\"MyValue2\"; echo $VARNAME2', shell=True) 

Выход:

> 
> MyValue2 

Ожидаемый результат:

> MyValue1 
> MyValue2 

не сможет струне команды вместе с ";" как и во втором методе.

Спасибо за помощь.

+3

Каждый прогон 'subprocess.call' запускает новую оболочку. Они не могут делиться этим путем. Если вам нужно установить переменные среды для порожденной оболочки, используйте 'env' kwarg функцию' call'. –

+0

Будет ли использование PIPE наилучшим способом передать последующие команды в один и тот же процесс оболочки? – digitaLink

+0

Хм? Нет. «PIPE» не позволяет вам произвольно использовать произвольные команды. О, я полагаю, вы могли бы ввести «PIPE» в «интерактивный» сеанс оболочки и отправить его на стандартный ввод ... да. Это кажется мне очень уродливым. Влияют ли ваши команды оболочки на переменные, которые вам нужны для последующих вызовов оболочки, или они просто используют общие внешние переменные среды? –

ответ

0

Чтобы установить переменные окружения вы должны использовать массив

os.environ Например:

import os  
os.environ['VARNAME1'] = "My value" 
+0

Это среда самого скрипта python. Затем он унаследован любыми процессами, которые запускает скрипт python, но 'subprocess.call' имеет аргумент * explicit *, чтобы переопределить это и использовать настраиваемую среду для порожденного процесса. «Env' kwarg. –