Змінні середовища можна отримувати, перевіряти, встановлювати (додавати або перезаписувати) та видаляти у програмах Python за допомогою os.environ. Зауважте, що зміни, внесені шляхом встановлення або видалення змінних середовища, є ефективними лише у програмі Python. Це не означає, що змінні системного середовища будуть переписані.
Тут подається наступна інформація.
os.environ
- Отримати змінні середовища.
- Встановіть (додайте/перепишіть) змінні середовища
- Видаліть змінні середовища
- Вплив зміни змінних середовища
- Переключення процесів за допомогою змінних середовища
Імпортуйте та використовуйте модуль os. Оскільки це стандартна бібліотека, ніякої додаткової установки не потрібно. Модуль підпроцесу також включений до стандартної бібліотеки.
import os
import subprocess
os.environ
Тип os.environ – os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ – це об’єкт типу карти з парою ключів і значень і має ті ж методи, що і словник (тип dict). Назва змінної середовища є ключовою, а її значення – значенням.
Вміст os.environ буде завантажено під час імпортування модуля os. Вміст os.environ не оновлюється, навіть якщо змінні системного середовища змінюються іншими засобами під час роботи програми.
Список відображається за допомогою print ().
# print(os.environ)
Як і у словнику, ви можете скористатися наведеними нижче методами або скористатися програмою in, щоб перевірити наявність ключів і значень.
keys()
values()
Обробка ключів і значень в основному така ж, як і для словників. Приклади наведені нижче.
Отримати змінні середовища.
os.environ[Environment variable name]
Це дозволить вам отримати значення змінної середовища, але якщо вказати назву змінної середовища, яка не існує, ви отримаєте помилку (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Метод get () os.environ може бути використаний для отримання значення за замовчуванням, якщо воно не існує. Це також те саме, що словник.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Також надається функція os.getenv (). Як і метод get () словника, він повертає значення за замовчуванням, якщо ключ не існує. Ця функція корисна, якщо ви просто хочете отримати і перевірити значення змінної середовища.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Встановіть (додайте/перепишіть) змінні середовища
os.environ[Environment variable name]
Призначивши цьому значення, ви можете встановити змінну середовища.
Якщо вказано нову назву змінної середовища, змінна середовища додається заново, а коли вказується назва існуючої змінної середовища, значення змінної середовища переписується.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Зауважте, що призначення будь -якого іншого, крім рядка, призведе до помилки (TypeError). Якщо ви хочете присвоїти числове значення, вкажіть його як рядок.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Також надається функція os.putenv (). Однак значення os.environ не оновлюється, коли воно встановлюється os.putenv (). З цієї причини бажано вказати ключ (ім’я змінної середовища) os.environ та призначити значення, як показано у наведеному вище прикладі.
Якщо putenv () підтримується, призначення елементу в os.environm автоматично перетворюється на відповідний виклик putenv (). На практиці присвоєння елементу в os.environ є кращою операцією, оскільки прямий виклик putenv () не оновлює os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Як згадувалося раніше, зміни, внесені шляхом додавання або перезапису змінних середовища, ефективні лише в межах програми Python. Це не означає, що змінні системного середовища будуть переписані.
Зауважте, що зміна значення може спричинити витік пам’яті залежно від ОС.
Примітка: На деяких платформах, включаючи FreeBSD та Mac OS X, зміна значення середовища може спричинити витік пам’яті.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Це пов’язано зі специфікацією putenv () самої ОС.
Successive calls to setenv() or putenv() assigning a differently sized value to the same name will result in a memory leak. The FreeBSD seman-tics semantics for these functions (namely, that the contents of value are copied and that old values remain accessible indefinitely) make this bug unavoidable.
Mac OS X Manual Page For putenv(3)
Видаліть змінні середовища
Щоб видалити змінну середовища, використовуйте метод pop () os.environ або оператор del. Те саме, що словник.
Нижче наведено приклад pop ().
pop () повертає значення змінної середовища, яка була видалена. За замовчуванням вказівка змінної середовища, яка не існує, призведе до помилки (KeyError), але вказівка другого аргументу поверне значення змінної середовища, якщо вона не існує.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Нижче наведено приклад del.
Змінна середовища додається знову, а потім видаляється. Якщо змінна середовища не існує, виникає помилка (KeyError).
os.environ['NEW_KEY'] = '100'
print(os.getenv('NEW_KEY'))
# 100
del os.environ['NEW_KEY']
print(os.getenv('NEW_KEY'))
# None
# del os.environ['NEW_KEY']
# KeyError: 'NEW_KEY'
Також надається функція os.unsetenv (). Однак, як і у випадку os.putenv (), значення os.environ не оновлюється, коли воно видаляється os.unsetenv (). Тому бажано вказати ключ (ім’я змінної середовища) os.environ і видалити його, як показано у прикладі вище.
Якщо unsetenv () підтримується, видалення елемента в os.environm автоматично переведеться на відповідний виклик unsetenv (). На практиці видалення елементів у os.environ є кращою операцією, оскільки прямі виклики unsetenv () не оновлюватимуть os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Видалення змінних середовища також ефективне лише в межах цієї програми Python. Він не видаляє змінні системного середовища.
Вплив зміни змінних середовища
Як я неодноразово писав, зміна (встановлення або видалення) змінної середовища os.environ не змінює змінну системного середовища, але вона впливає на підпроцеси, які запускаються в програмі.
Наступний код не працюватиме належним чином у Windows, оскільки немає змінної середовища LANG, а вміст команди дати відрізняється.
Виклик команди date у модулі підпроцесу.
Результат виводу команди date змінюється залежно від значення змінної середовища LANG.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(subprocess.check_output('date', encoding='utf-8'))
# 2018年 7月12日 木曜日 20時54分13秒 JST
#
os.environ['LANG'] = 'en_US'
print(subprocess.check_output('date', encoding='utf-8'))
# Thu Jul 12 20:54:13 JST 2018
#
Для пояснення ми змінили змінну середовища LANG в os.environ, але Python надає модуль локалі для керування мовою.
Переключення процесів за допомогою змінних середовища
Також можна перемикати процес відповідно до значення змінної середовища.
Ось приклад зміни виводу відповідно до змінної середовища LANG у налаштуваннях мови. Тут ми використовуємо метод startwith (), щоб визначити, чи починається рядок із зазначеного рядка, але якщо ви хочете визначити точну відповідність, ви можете використати “==” для порівняння.
print(os.getenv('LANG'))
# en_US
if os.getenv('LANG').startswith('ja'):
print('こんにちは')
else:
print('Hello')
# Hello
os.environ['LANG'] = 'ja_JP'
if os.getenv('LANG').startswith('ja'):
print('こんにちは')
else:
print('Hello')
# こんにちは
Крім того, якщо змінні середовища встановлені, наприклад, для вказівки середовища розробки та виробничого середовища, можна отримати значення цих змінних та переключити процес.