2013-12-11 3 views
0

Прошу прощения, если мой вопрос не очень ясен.Передача переменной в окружающую среду

Я пытаюсь создать переменную, передав ее в среду в linux. Затем я хочу получить эту переменную где-то еще. То, что я пробовал до сих пор в командной строке linux:

local_pc:~/home$ export variable=10 
local_pc:~/home$ python -c 'import os; print os.getenv("variable")' 
10 

который все звучит нормально. Но когда я поставил export в питоне я не смог получить его

subprocess.call(["export","variable=20"],shell = True) 
print(os.getenv("variable")) 
None 

Так что мой вопрос здесь в том, как сделать xport variable=10 в питоне

+0

Вы можете использовать 'subprocess.Popen' для трубы выводить из 'send.py' в' receive.py' и записывать переменную окружения и ее значение в канал. 'receive.py' тогда должен был бы прочитать эти данные из трубы и соответствующим образом изменить ее среду.Не знаете, что вам еще нужно. –

+2

Не могли бы вы предоставить более подробную информацию? Не сосредотачивайтесь на том, как это сделать, просто опишите, что вы хотите сделать (на простом английском языке), а затем покажите, что вы пробовали (минимальный, но полный пример кода) и каким образом он потерпел неудачу (ввод/вывод, отслеживание, если есть). – jfs

+0

Привет, извините, если мой вопрос не очень ясен. – Mero

ответ

1

обновления:

Там нет реального способа установить связь с процессами через переменные среды.

Ребенок может наследовать переменные среды от родителя, но изменение родительских переменных окружения после вызова childs не будет передано дочернему элементу, а изменения среды ребенка полностью непрозрачны для родителя. Так что нет!

Я протестировал его, пытаясь установить подход к передаче сообщений с циклическим, основанным на токенах, но я не вижу способа получить изменения, переданные между переменными среды процесса.

+0

@Sebastian: Я догадался, но на самом деле не пробовал, пока не будет ваш комментарий. И вы абсолютно правы. Измененный ответ в соответствии с вашим вводом! –

+0

env vars - это свойство процесса, а не «shell-товар» – yaccz

+0

@yaccz: я стоял снова исправлен. спасибо! –

2

Вы можете изменить переменную окружения только для текущего процесса или его детей. Для изменения среды в ее родительском процессе потребуются хаки, например, с использованием gdb.

В вашем примере export variable=10 выполняется в том же процессе и python -c .. команда является дочерним процессом (оболочки). Поэтому он работает.

В примере на примере Python вы пытаетесь (неправильно) экспортировать переменную в дочерний процесс и получить его в родительском процессе.

Резюмируя:

  • работает пример: родитель устанавливает переменные среды для ребенка
  • нерабочего примера: ребенок пытается установить переменные окружения для родителей

Чтобы воспроизвести ваш Баш пример:

import os 
import sys 
from subprocess import check_call 

#NOTE: it works but you shouldn't do it, there are most probably better ways  
os.environ['variable'] = '10' # set it for current processes and its children 
check_call([sys.executable or 'python', '-c', 
      'import os; print(os.getenv("variable"))']) 

Подпроцесс либо наследует среду родителя, либо вы можете явно установить его с помощью аргумента env.

Например, чтобы изменить локальный часовой пояс, который используется time модулем, можно изменить TZ переменную среды для текущего процесса питона на системах Posix:

import os 
import time 

os.environ['TZ'] = ':America/New_York' 
time.tzset() 

is_dst = time.daylight and time.localtime().tm_isdst > 0 
# local time = utc time + utc offset 
utc_offset = -time.timezone if not is_dst else -time.altzone 
print("%s has utc offset: %.1f hours" % (
    os.environ.get('TZ').lstrip(':'), utc_offset/3600.)) 
+0

примечание: 'time.daylight' может быть неправильным в [некоторых случаях края] (http://www.selenic.com/pipermail/mercurial-devel/2011-November/035657.html). – jfs

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