Змінні середовища Python і як з ними працювати

Хочете краще керувати своєю конфігурацією? Дізнайтеся, як працювати зі змінними середовища в Python.

Коли я навчався Python, я створював проекти, щоб застосувати те, про що щойно дізнався. Підмножина тих, що включають підключення до бази даних і запити до неї за допомогою Python. Це означало, що мені потрібно було зберігати конфігурацію бази даних і конфіденційну інформацію, таку як ім’я користувача та пароль для автентифікації.

Жорстке кодування такої конфіденційної інформації в сценарії Python було не гарною ідеєю. І я навчився використовувати файли конфігурації та змінні середовища разом із вбудованими модулями Python для роботи з ними.

Тож щоразу, коли мені потрібно використовувати конфіденційну інформацію, як-от паролі та ключі API, у моїх програмах, я встановлюю їх як змінні середовища та за потреби витягую їх. У цьому посібнику я розповім вам про змінні середовища та про те, як працювати з ними в Python.

Що таке змінні середовища?

Змінні середовища — це зовнішні по відношенню до вашої програми змінні, які зберігають конфігураційну інформацію, параметри системи тощо. Зазвичай ними керує операційна система або середовище програми. Ключові характеристики змінних середовища включають:

  • Пари ім’я-значення: Змінні середовища складаються з імені (також відомого як ключ) і відповідного значення.
  • Область дії системи: ви можете встановити змінні середовища на рівні системи, зробивши їх доступними для всіх процесів, що виконуються в системі. Якщо потрібно, ви також можете змінити або визначити їх на рівні програми, впливаючи лише на цю конкретну програму.
  • Динамічний і змінний: ви можете змінювати змінні середовища під час виконання, забезпечуючи гнучкість.

Чим корисні змінні середовища

Змінні середовища пропонують кілька переваг для керування конфігурацією та конфіденційною інформацією у ваших програмах Python:

  • Відокремлення завдань: зберігаючи конфігурацію поза кодом, ви відокремлюєте питання керування конфігурацією від логіки програми.
  • Безпека. Ви можете зберігати конфіденційні дані, наприклад ключі API та облікові дані бази даних, у змінних середовища, не розкриваючи їх у вихідному коді, зменшуючи ризик розголошення.
  • Гнучкість: за допомогою змінних середовища оновлення параметрів конфігурації є простим, оскільки ви можете оновлювати/вносити зміни за межами бази коду. Змінні середовища дозволяють налаштовувати параметри конфігурації, не змінюючи код. Ця гнучкість особливо корисна для розгортання програм у різних середовищах або під час оновлення облікових даних.
  Lootie Free Mystery Box Codes: викупіть зараз

У наступних розділах цього посібника ми розглянемо, як установлювати, отримувати доступ і керувати змінними середовища в Python і як вони покращують керування конфігурацією у ваших проектах.

Як встановити змінні середовища

Ви можете встановити змінні середовища за допомогою командного рядка. Область таких змінних середовища стосується лише поточного сеансу, і вони не зберігаються за межами поточного сеансу.

Якщо ви користуєтеся комп’ютером Mac або Linux, ви можете встановити змінну середовища в поточному термінальному сеансі так:

export MY_VARIABLE=my_value

Якщо ви користувач Windows, ви можете тимчасово встановити змінну середовища, як показано:

set MY_VARIABLE=my_value

Доступ до змінних середовища в Python

Python надає модуль os для функцій, пов’язаних з операційною системою. А os.environ — це словник змінних середовища. Назви змінних середовища та їх значення є ключами та значеннями словника відповідно.

Таким чином, ви можете отримати доступ до значень змінних середовища, використовуючи (їх імена як) ключі, так само, як ви отримуєте доступ до елементів словника.

Ось кілька прикладів:

import os
print(os.environ['HOME'])
# Output: /home/balapriya
print(os.environ['USER'])
# Output: balapriya

Все йде нормально. Але що станеться, якщо ви спробуєте отримати доступ до значення змінної середовища, яке ніколи не встановлювалося?

Давайте спробуємо отримати доступ до API_KEY, який ми ще не встановили:

print(os.environ['API_KEY'])

Як і очікувалося, ви отримаєте KeyError:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<frozen os>", line 679, in __getitem__
KeyError: 'API_KEY'

Обробка ключових помилок

Ви можете обробити KeyError, як показано:

import os

try:
	api_key = os.environ['API_KEY']
	print(f'API_KEY is set to: {api_key}')
except KeyError:
	print('API_KEY is not set. Please configure it.')

Цей підхід не зупиняє раптово виконання програми, коли виникає виняток KeyError. Однак він надає описове повідомлення про помилку:

# Output
API_KEY is not set. Please configure it.

Отже, коли решта програми не виконується належним чином, ми знаємо, що пропустили налаштування необхідної змінної середовища.

Доступ до змінних середовища за допомогою методу get().

Ви можете використовувати метод словника get(), щоб отримати значення змінної середовища. Замість KeyError метод get() повертає None, якщо змінну не знайдено.

Доступ до змінної NOT_SET, яку ми не встановили, повертає None:

print(os.environ.get('NOT_SET'))
# Output: None

Я віддаю перевагу виклику Key Error, коли змінна середовища не встановлена. Потім дозвольте йому пройти мовчки або буде включено в None, який повертає метод get().

Але метод get() корисний, коли ми можемо передати значення за замовчуванням для певної змінної середовища, якщо воно не встановлено.

  Розуміння кредитування та позичання криптовалюти для початківців

Ось приклад:

print(os.environ.get('HOME','/home/user'))
# Output: /home/balapriya

Як керувати конфігурацією за допомогою змінних середовища

Тепер давайте розглянемо кілька практичних прикладів, де ми використовуємо змінні середовища в нашій програмі.

Приклад 1: Налаштування параметрів підключення до бази даних

Скажімо, ви хочете підключитися до бази даних PostgreSQL з Python. Для цього ви можете встановити та використовувати конектор psycopg2:

pip install psycopg2

У цьому прикладі ми використовуємо змінні середовища для налаштування параметрів підключення до бази даних. Якщо змінні середовища не встановлено, ми надаємо значення за замовчуванням для використання.

import os
import psycopg2  

# Retrieve database configuration from environment variables
db_host = os.environ.get('DB_HOST', 'localhost')
db_port = os.environ.get('DB_PORT', '5432')
db_user = os.environ.get('DB_USER', 'myuser')
db_password = os.environ.get('DB_PASSWORD', 'mypassword')

# Establish a database connection
try:
	connection = psycopg2.connect(
    	host=db_host,
    	port=db_port,
    	user=db_user,
    	password=db_password,
    	database="mydb"
	)
	print('Connected to the database!')
except Exception as e:
	print(f'Error connecting to the database: {e}')

Приклад 2: Керування ключами API

Розглянемо інший приклад, який передбачає використання ключів API.

Окрім інтерфейсу ChatGPT, ви також можете використовувати OpenAI API для підтримки OpenAI LLM у своїх програмах.

Коли ви реєструєте обліковий запис OpenAI, ви (зазвичай бачите) кілька безкоштовних кредитів API з обмеженим часом. Візьміть свій ключ API, перейшовши до Налаштувань > Переглянути ключі API.

Ви можете використовувати Open AI Python SDK і фреймворк, як-от LangChain, для створення програм. Для цього вам потрібно встановити бібліотеки (у віртуальному середовищі) за допомогою pip:

pip install openai
pip install langchain 

Ось як можна встановити OPENAI_API_KEY як змінну середовища:

import os
os.environ["OPENAI_API_KEY"]='your-api-key'

Тепер ви можете отримати доступ до Open AI LLM у своєму сценарії так:

from langchain.llms import OpenAI
model=OpenAI(model_name="gpt-3.5-turbo")

Як змінити змінні середовища в Python

Ви можете скористатися словником os.environ із модуля os, щоб змінити змінні середовища в поточному процесі Python:

import os

# Modify an existing environment variable or create a new one
os.environ['MY_VARIABLE'] = 'new_value'

У Python ви можете використовувати модуль підпроцесу для створення підпроцесів із існуючого сценарію Python. Це корисно, коли ви хочете запускати системні програми на Python.

У наступному прикладі ми змінюємо змінну середовища PATH, торкнувшись словника os.environ. Потім ми запускаємо echo $PATH як підпроцес:

import os
import subprocess

# Set a custom environment variable for the subprocess
os.environ['PATH'] = '/custom/path'

# Run a subprocess that accesses the PATH environment variable
result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE)
output = result.stdout.decode()
print(output)
print(f'Subprocess output: {output}')

Ми бачимо, що PATH приймає значення /custom/path:

# Output
/custom/path

Область змінених змінних середовища

Важливо зазначити, що ці оновлення змінних середовища є тимчасовими та дійсними лише для поточного процесу Python. Після завершення сценарію зміни скасовуються:

  • Поточний процес Python: коли ви змінюєте змінну середовища за допомогою os.environ у вашому сценарії Python, зміна локальна для поточного процесу Python. Це не вплине на інші запущені процеси чи майбутні сеанси Python.
  • Дочірні процеси: зміни змінних середовища, внесені в поточний процес Python, успадковуються дочірніми процесами, створеними вашим сценарієм. Наприклад, якщо ви створюєте підпроцес зі свого сценарію Python (батьківський процес), дочірній процес матиме доступ до змінених змінних середовища (як показано в прикладі).
  • Не загальносистемні: Змінні середовища, встановлені в сценарії Python, не зберігатимуться поза виконанням цього сценарію.
  Як зробити це швидко та легко

Якщо вам потрібно внести постійні зміни до змінних середовища на системному рівні, зазвичай це потрібно зробити за допомогою методів, специфічних для операційної системи.

Як завантажити файли .env за допомогою python-dotenv

The бібліотека python-dotenv це популярний пакет Python, який спрощує процес завантаження змінних середовища з файлу .env у ваш проект Python. Це особливо корисно, коли у вас є кілька середовищ (наприклад, розробка, виробництво) з різними конфігураціями, і ви хочете зберегти ці налаштування окремо від вихідного коду.

Встановлення python-dotenv

Щоб використовувати python-dotenv, вам потрібно спочатку встановити його. Ви можете встановити його — у віртуальному середовищі — за допомогою pip, менеджера пакетів Python:

pip install python-dotenv

Завантаження змінних середовища з файлу .env

Тепер ви можете створити файл .env у кореневому каталозі свого проекту та заповнити його парами ключ-значення, як і звичайні змінні середовища. Давайте створимо такий файл .env зі значеннями заповнювачів:

API_KEY=your_api_key_here
DB_PASSWORD=your_database_password_here

Тепер ви можете завантажити змінні середовища з файлу .env за допомогою python-dotenv так:

import os
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

# Access the environment variables
api_key = os.getenv("API_KEY")
database_password = os.getenv("DB_PASSWORD")

# Print out the env variables
print(f"API Key: {api_key}")
print(f"Database Password: {database_password}")

Зверніть увагу, що ми використовували os.getenv(VARIABLE_NAME) для отримання значень змінних середовища. Це також дійсний (і рідше використовуваний) спосіб доступу до змінних середовища.

Ось результат:

API Key: your-api-key-here
Database Password: your-database-url-here

У цьому прикладі:

  • Ми використовуємо load_dotenv() для завантаження змінних середовища, визначених у файлі .env, у поточне середовище.
  • Потім ми використовуємо os.getenv() для доступу до змінних середовища: API_KEY і DB_PASSWORD.

Висновок

І це обгортка! Сподіваюся, ви навчилися керувати конфігурацією та конфіденційною інформацією за допомогою змінних середовища в програмах Python. Ми розглянули основи налаштування та доступу до змінних середовища, а також їх практичне використання під час налаштування програм.

Хоча змінні середовища, безумовно, корисні для відокремлення конфігурації від вихідного коду, ви повинні зберігати конфіденційні змінні як секрети у випадках використання у виробництві. Для керування секретами я рекомендую досліджувати такі інструменти, як HashiCorp Vault або Менеджер секретів AWS.