Хочете краще керувати своєю конфігурацією? Дізнайтеся, як працювати зі змінними середовища в Python.
Коли я навчався Python, я створював проекти, щоб застосувати те, про що щойно дізнався. Підмножина тих, що включають підключення до бази даних і запити до неї за допомогою Python. Це означало, що мені потрібно було зберігати конфігурацію бази даних і конфіденційну інформацію, таку як ім’я користувача та пароль для автентифікації.
Жорстке кодування такої конфіденційної інформації в сценарії Python було не гарною ідеєю. І я навчився використовувати файли конфігурації та змінні середовища разом із вбудованими модулями Python для роботи з ними.
Тож щоразу, коли мені потрібно використовувати конфіденційну інформацію, як-от паролі та ключі API, у моїх програмах, я встановлюю їх як змінні середовища та за потреби витягую їх. У цьому посібнику я розповім вам про змінні середовища та про те, як працювати з ними в Python.
Що таке змінні середовища?
Змінні середовища — це зовнішні по відношенню до вашої програми змінні, які зберігають конфігураційну інформацію, параметри системи тощо. Зазвичай ними керує операційна система або середовище програми. Ключові характеристики змінних середовища включають:
- Пари ім’я-значення: Змінні середовища складаються з імені (також відомого як ключ) і відповідного значення.
- Область дії системи: ви можете встановити змінні середовища на рівні системи, зробивши їх доступними для всіх процесів, що виконуються в системі. Якщо потрібно, ви також можете змінити або визначити їх на рівні програми, впливаючи лише на цю конкретну програму.
- Динамічний і змінний: ви можете змінювати змінні середовища під час виконання, забезпечуючи гнучкість.
Чим корисні змінні середовища
Змінні середовища пропонують кілька переваг для керування конфігурацією та конфіденційною інформацією у ваших програмах Python:
- Відокремлення завдань: зберігаючи конфігурацію поза кодом, ви відокремлюєте питання керування конфігурацією від логіки програми.
- Безпека. Ви можете зберігати конфіденційні дані, наприклад ключі API та облікові дані бази даних, у змінних середовища, не розкриваючи їх у вихідному коді, зменшуючи ризик розголошення.
- Гнучкість: за допомогою змінних середовища оновлення параметрів конфігурації є простим, оскільки ви можете оновлювати/вносити зміни за межами бази коду. Змінні середовища дозволяють налаштовувати параметри конфігурації, не змінюючи код. Ця гнучкість особливо корисна для розгортання програм у різних середовищах або під час оновлення облікових даних.
У наступних розділах цього посібника ми розглянемо, як установлювати, отримувати доступ і керувати змінними середовища в 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.