2016-03-03 9 views
1

Я пытаюсь изменить переменные среды на родительской оболочке изнутри python. До сих пор я не пытался:установка переменных среды родительской оболочки в python

~ $ export TESTING=test 
~ $ echo $TESTING 
test 
~ $ 
~ $ 
~ $ python 
Python 2.7.10 (default, Jun 1 2015, 18:05:38) 
[GCC 4.9.2] on cygwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> os.environ['TESTING'] 
'test' 
>>> os.environ['TESTING'] = 'changed' 
>>> os.environ['TESTING'] 
'changed' 
>>> quit() 
~ $ 
~ $ 
~ $ echo $TESTING 
test 

Это все, что я смог придумать. Это можно сделать?

+2

модифицирования среды родительский процесс сводится к изменению его пространства памяти, что означает, что вообще нет, это невозможно. – chepner

ответ

2

Это невозможно.

Реальные процессы наследуют окружающую среду от родителей, а не делят их. Поэтому любые изменения, внесенные вами в вашу среду, будут отображаться только в процессе child (python). Практически, вы просто переписываете словарь, созданный модулем os, основанный на вашей среде вашей оболочки, а не фактические переменные среды вашей оболочки.

https://askubuntu.com/questions/389683/how-we-can-change-linux-environment-variable-in-python

Why can't environmental variables set in python persist?

2

Что вы можете сделать, это разобрать вывод команды Python в качестве команд оболочки, используя Command Substitution функциональность командного интерпретатора, который чаще используется для оценки команды в линии другой команды. Например. chown `id -u` /somedir.

В вашем случае вам нужно распечатать команды оболочки на stdout, которые будут оцениваться оболочкой. Создайте свой скрипт на Python и добавить:

testing = 'changed' 
print 'export TESTING={testing}'.format(testing=testing) 

то из вашей оболочки:

$ `python my_python.sh` 
$ echo TESTING 
changed 

В принципе, любая строка будет интерпретирована оболочкой, даже ls, rm и т.д.

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