Изменение переменных оболочки

izmenenie peremennyh obolochki Контекст выполнения сценариев

Как и обычные словари, объект os.environ поддерживает обращение по ключу и присваивание. Операция присваивания, применяемая к словарям, изменяет значение ключа:

>>> os.environ[‘TEMP’]

‘C:\\Users\\mark\\AppData\\Local\\Temp

>>> os.environ[‘TEMP’] = r’c:\temp’

>>> os.environ[‘TEMP’]

c:\\temp

Но в данном случае выполняются некоторые дополнительные действия. Во всех последних версиях Python значения, присваиваемые ключам os.environ таким способом, автоматически экспортируются в другие части приложения. То есть присваивание по ключу изменяет не только объект os.environ в программе, но и соответствующую переменную в окружении оболочки для процесса выполняемой программы. Новое значение переменной становится видимым программе на языке Python, всем связанным с ней модулям на языке C и всем программам, порождаемым процессом Python.

За кулисами при присваивании объекту os.environ по ключу происходит вызов os.putenv — функции, изменяющей переменную окружения за границами интерпретатора Python. Чтобы показать, как это работает, нам потребуется пара сценариев, которые изменяют и получают значения переменных оболочки. Первый из них приводится в примере 3.3.

Пример 3.3. PP4E\System\Environment\setenv.py

import os

print(‘setenv…’, end=’ ‘)

print(os.environ[‘USER’]) # выведет текущее значение переменной оболочки

os.environ[‘USER’] = Brian# неявно вызовет функцию os.putenv os.system(‘python echoenv.py’)

os.environ[‘USER’] = Arthur# изменение передается порождаемым программам os.system(‘python echoenv.py’) # и связанным с процессом библ. модулям на C

os.environ[‘USER’] = input(‘?’)

print(os.popen(‘python echoenv.py’).read())

Данный сценарий setenv.py просто изменяет переменную оболочки USER и запускает другой сценарий, выводящий значение этой переменной, который приводится в примере 2.5.

Пример 3.4. PP4E\System\Environment\echoenv.py

import os

print(‘echoenv…’, end=’ ‘)

print(‘Hello,’, os.environ[‘USER’])

Независимо от способа запуска сценарий echoenv.py выводит значение переменной окружения USER. При запуске из командной строки этот сценарий выведет значение, установленное нами в самой оболочке:

C:\\PP4E\System\Environment> set USER=Bob

C:\\PP4E\System\Environment> python echoenv.py

echoenvHello, Bob

Однако при запуске из другого сценария, например, из setenv.py, с помощью функции os.system или os.popen, с которыми мы познакомились ранее, сценарий echoenv.py получит то значение переменной USER, которое было установлено родительской программой:

C:\\PP4E\System\Environment> python setenv.py

setenvBob

echoenvHello, Brian

echoenvHello, Arthur

?Gumby

echoenvHello, Gumby

C:\\PP4E\System\Environment> echo %USER%

Bob

Точно так же этот механизм действует и в Linux. Вообще говоря, порождаемая программа всегда наследует значения переменных окружения от своих родителей. Порожденными программами являются такие, которые запускаются средствами Python, например os.spawnv, комбинацией os.fork/exec в Unix-подобных системах, и os.popen, os.system или с помощью модуля subprocess на ряде других платформ. Все программы, запущенные таким способом, получают значения переменных окружения, существующие в момент запуска в родительском процессе.[VII]

Подобный способ установки переменных окружения перед запуском новой программы является одним из способов передачи информации в новую программу. Например, можно написать сценарий, изменяющий переменную PYTHONPATH включением в нее пользовательских каталогов, перед запуском других сценариев. Благодаря этому запущенный сценарий получит свой путь поиска модулей в списке sys.path, потому что переменные оболочки передаются потомкам (такой запускающий сценарий будет представлен в конце главы 6).

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий