Python'da environment variable'larni qanday sozlash mumkin (bosqichma-bosqich)
Python'da environment variable'larni sozlashning 3 usulini o'rganing: os.environ, shell konfiguratsiyasi va .env fayllar. Nusxa olishga tayyor kod va keng tarqalgan muammolarning yechimlari.
Muallif: Kimberly Fessel
Siz yaxshi biladigan va sevadigan oddiy Python o'zgaruvchilarida hech qanday ayb yo'q. Ular script'laringizda yuradi, kerak bo'lganda qiymatlarni ifodalaydi va sizdan unchalik ko'p e'tibor talab qilmaydi. Ammo ba'zi o'zgaruvchilar-chi? Ba'zi o'zgaruvchilar buyukroq ishlar uchun yaratilgan. Ularning orzulari kattaroq va environment variable darajasiga ko'tarilganlari uchun hurmatingizga loyiq.
Hazil bir chetda, yangi boshlovchilar uchun mo'ljallangan ushbu maqolada environment variable'lar haqida hamma narsani o'rganasiz. Environment variable'lar nima ekanini, ularga Python script'laringizda qanday murojaat qilish mumkinligini va ularni uch xil usulda qanday sozlashni ko'rib chiqamiz. Shuningdek, environment variable'lar production environment'larida qanday ishlashi va credential'lar hamda API key'lar kabi maxfiy ma'lumotlarni qanday qilib xavfsizroq boshqarish mumkinligi kabi bir nechta qo'shimcha mavzular bilan ham tanishasiz.
Environment variable nima?
Environment variable — ilovangiz kodidan tashqarida saqlanadigan key-value juftligi. Bu dasturlar o'zining ish muhitidan olishi mumkin bo'lgan konfiguratsiya ma'lumotidir. Odatda path'lar (PATH), ma'lumotlar bazasi URL'lari (DATABASE_URL) va API key'lar kabi credential'lar (API_KEY) environment variable sifatida saqlanadi.
Environment variable'lar odatda string bo'ladi. Ular konfiguratsiya ma'lumotlarini source code'dan ajratish imkonini beradi. Bu sizga turli jihatlardan foyda keltiradi:
-
Bir xil ilova kodi development, testing va production'da turli qiymatlardan foydalanishi mumkin.
-
Bir nechta ilova bir xil konfiguratsiya o'zgaruvchilaridan ularni qayta yozmasdan foydalana oladi.
-
Masalan, kodingizni GitHub'da ommaga ulashmoqchi bo'lsangiz, maxfiy ma'lumotlarni sir saqlab qolishingiz mumkin.
Python'da environment variable'lar
Siz o'rganib qolgan Python o'zgaruvchilari dasturning o'zi ichida mavjud bo'ladi. Python'dagi environment variable'lar esa odatda bunday emas. Ular process environment'ingizning bir qismi bo'lib, Python kodingizdan tashqarida yashaydi.
Python environment variable'lari bilan ishlaganda sizga kerak bo'ladigan asosiy module — os. Faqat script'ingiz boshiga import os qo'shishni unutmang. os module'i os.environ'ni taqdim etadi. Bu hozirda sizga mavjud bo'lgan environment variable'larni topish imkonini beradigan mapping obyektidir.
Python o'zgaruvchilari va Python'dagi environment variable'lar o'rtasidagi farqni tushunish uchun oddiy API URL'ini olishni ko'rib chiqing. Bu kod o'zgaruvchilarni odatiy tarzda aniqlashni ko'rsatadi:
api_url = "https://example.com"
Biroq Python'ning os module'ini yuklagandan keyin xuddi shu ma'lumotni environment variable'dan mana bunday olishingiz mumkin:
import os
api_url = os.environ["API_URL"]
Bu kod boshqacha ishlaydi, chunki URL'ni hard-code qilish o'rniga u "API_URL" key'iga bog'langan qiymatni topish uchun os.environ'ga tayanadi. Shuningdek, Python environment variable'larni string sifatida saqlashi va qaytarishiga e'tibor bering — ulardan kodingizning boshqa joylarida foydalanishingiz mumkin.
Environment variable'larga murojaat qilishdan tashqari, Python kodi yordamida ilova ichidan environment variable'larni o'rnatishingiz ham mumkin. Shu tarzda o'rnatilgan o'zgaruvchilardan joriy ilovangiz ham, u ishga tushiradigan har qanday dastur ham foydalana oladi. Biroq Python ichidan yaratgan environment variable'laringiz odatda vaqtinchalik bo'ladi. Bunday environment variable'lar faqat joriy ilovangiz va undan ishga tushirilgan dasturlar tugaguniga qadar mavjud bo'ladi.
Python: environment variable'larni vaqtinchalik o'rnatish
Python dasturlarida environment variable o'rnatish uchun har birini key-value juftligi sifatida tayinlang — xuddi dictionary'ga ma'lumot qo'shganingiz kabi. Masalan, API key'ingiz uchun environment variable'ni quyidagi kodga o'xshab yaratib, uni o'qib olishingiz mumkin:
import os
os.environ["API_KEY"] = "my_key123"
print(os.environ["API_KEY"])
# Expected result:
# my_key123
Key'lar ham, value'lar ham faqat string bo'lishi shart, lekin to'g'ri ma'lumot bergan bo'lsangiz, dasturingiz bu ma'lumotga darhol ega bo'ladi. Bundan tashqari, kodingizdan ishga tushirilgan dasturlar ham bu o'zgaruvchilardan foydalana oladi.
Biroq Python dasturlarida environment variable yaratish operatsion tizimingiz muhitini doimiy ravishda o'zgartirmaydi. Ular faqat joriy process'ga va u ishga tushiradigan har qanday child process'ga tegishli bo'ladi.
Environment variable'ning bu turi testlash yoki vaqtinchalik konfiguratsiyalarni sozlash uchun foydali bo'lishi mumkin. Ammo dasturingiz tugagandan keyin ham environment variable'dan foydalanmoqchi bo'lsangiz yoki unga bir nechta mustaqil dastur kira olishini istasangiz, uni Python script'ingizdan tashqarida aniqlashingiz kerak bo'ladi.
Environment variable'larni doimiy o'rnatish
Agar environment variable faqat dasturingiz ishlab turgan vaqt uchun emas, balki doimiy o'rnatilishi kerak bo'lsa, uni Python'dan tashqarida aniqlashingiz mumkin. Doimiy deb ataladigan environment variable yaratish usuli qaysi turdagi operatsion tizim va shell'dan foydalanayotganingizga bog'liq.
Operatsion tizim va command line
macOS yoki Linux foydalanuvchilari environment variable'larni shell konfiguratsiya fayliga qo'shishi mumkin. Agar zsh'dan foydalansangiz, o'zgaruvchini .zshrc'ga, bash uchun esa .bashrc'ga qo'shing. Masalan, tegishli konfiguratsiya fayliga quyidagi kod satrini qo'shishingiz mumkin:
export API_KEY="my_key123"
Windows foydalanuvchilari command line'dan setx yordamida environment variable'ni doimiy o'rnatishi mumkin. Masalan, command line'ingizda quyidagi kodni ishga tushirishingiz mumkin:
setx API_KEY "my_key123"
Yodda tuting: yangi qo'shilgan environment variable'dan foydalana olishingizdan oldin, ehtimol, shell konfiguratsiyangizni qayta yuklashingiz yoki yangi terminal oynasini ochishingiz kerak bo'ladi.
Environment variable'larga murojaat qilish
Doimiy environment variable yaratganingizdan keyin unga Python ichida os module'i orqali murojaat qilasiz — xuddi vaqtinchalik o'zgaruvchini olganingiz kabi. Environment variable'ni tezda tekshirish uchun uning qiymatini konsolga chiqaring:
import os
print(os.environ["API_KEY"])
# Expected result:
# my_key123
Agar Python API_KEY uchun qiymat topa olmasa, unga os.environ bilan murojaat qilmoqchi bo'lganingizda KeyError olasiz. Buning o'rniga os.getenv()'dan foydalanishingiz mumkin: u environment variable mavjud bo'lmaganda, agar o'zingiz default qiymat bermagan bo'lsangiz, None qaytaradi:
import os print(os.getenv("API_KEY"))
print(os.getenv("API_VALUE"))
print(os.getenv("API_VALUE", "default_value"))
# Expected result:
# my_key123
# None
# default_value
python-dotenv bilan .env fayllardan foydalanish
Lekin muayyan loyiha uchun barcha dasturlaringizga tegishli bo'lishi shart bo'lmagan konfiguratsiya sozlamalari bo'lsa-chi? Python dasturchilari ko'pincha loyihaga xos environment variable'larni .env faylga ajratib qo'yadi. Bu o'zgaruvchilaringizni butun tizimingiz bo'ylab aniqlamasdan, ularni Python source code'ingizdan alohida saqlaydi.
Mana .env faylga misol:
API_KEY=my_key123
DATABASE_URL=my_database_url
Ehtimol, bu .env faylni unga murojaat qilishi kerak bo'lgan Python script'lar bilan birga loyiha papkangizda saqlaysiz.
.env'da saqlangan environment variable'larga murojaat qilish vaqti kelganda, ma'lumotlarni yuklashga yordam beradigan python-dotenv kabi module kerak bo'ladi. python-dotenv'ni o'rnatishingiz kerak bo'ladi, masalan, pip yordamida:
pip install python-dotenv
So'ng environment variable'larni .env'dan dasturingiz muhitiga yuklash uchun load_dotenv() funksiyasidan foydalaning va ularga odatdagidek os.environ yoki os.getenv() orqali murojaat qiling:
from dotenv import load_dotenv
import os
load_dotenv()
print(os.environ["DATABASE_URL"])
# Expected results:
# my_database_url
Agar loyihangizni kuzatish uchun Git va GitHub'dan foydalansangiz, .env'ni .gitignore'ga qo'shishni unutmang. .env ichidagi credential'larni maxfiy saqlang va ularni hech qachon GitHub'ga commit qilmang. Istasangiz, kerakli o'zgaruvchi nomlari bor, lekin haqiqiy maxfiy ma'lumotlar bo'lmagan .env.example fayl yaratishingiz mumkin.
Taqqoslash jadvali
Environment variable'larni va har bir yondashuvni qachon qo'llashni yaxshiroq tushunish uchun quyida ularni yaratish usullarini taqqoslang. Eng yaxshi usul environment variable'larni doimiy saqlash kerakmi yoki ulardan faqat vaqtinchalik foydalanasizmi — shunga bog'liq. Har bir usulning asosiy o'xshashlik va farqlarini jamlaydigan tezkor taqqoslash jadvali:
| Usul | Qayerda aniqlanadi | Saqlanish muddati | Eng yaxshi qo'llanishi | Asosiy e'tiborga olinadigan jihat |
|---|---|---|---|---|
Python / os.environ |
Python kodi | Joriy dastur va uning child process'lari | Testlash, vaqtinchalik konfiguratsiyalar | Dastur tugaganda yo'qoladi |
| OS / shell konfiguratsiyasi | .zshrc, .bashrc, Windows muhiti | Session'lar davomida | Tizim / foydalanuvchi darajasidagi konfiguratsiya | Bitta loyihadan tashqarida ham mavjud |
| .env fayl | Loyiha fayli | Kerak bo'lganda yuklanadi | Loyihaga xos, lokal konfiguratsiya | python-dotenv bilan yuklang; .gitignore'ga qo'shing |
Qaysi usulni tanlamang, alohida environment variable'larga kodingizdan os.environ yoki os.getenv() orqali murojaat qilishingiz mumkin.
Turli environment'larda environment variable'larni boshqarish
Professional muhitda bir xil ilovani development, testing, staging va production uchun turli konfiguratsiya sozlamalari bilan ishga tushirishingiz kerak bo'lishi mumkin. Masalan, har bir environment uchun alohida ma'lumotlar bazasi credential'lari, API endpoint'lari yoki logging darajalari bo'lishi mumkin. Dasturingiz bularni hisobga olishi kerak, environment variable'lar esa to'g'ri qiymatlarni Python script'laringizga hard-code qilmasdan almashtirish uchun ajoyib usul beradi.
Virtual environment'lar
Ilgari muayyan loyiha uchun Python interpreter'i va kerakli package'larni izolyatsiya qilish maqsadida virtual environment'dan foydalangan bo'lishingiz mumkin. Virtual environment'lar ham, environment variable'lar ham qandaydir ma'lumotni izolyatsiya qilishni maqsad qilgan bo'lsa-da, ular bir narsa emas. Virtual environment'lar package'larga e'tibor qaratadi, environment variable'lar esa konfiguratsiya ma'lumotlari uchun.
Faollashtirilgan Python virtual environment'idan foydalanayotganda ham environment variable'lar bilan ishlashingiz mumkin. Uning ichidan mavjud doimiy environment variable'laringizga murojaat qiling yoki vaqtinchalik o'zgaruvchilarni o'rnating. Dasturlarni lokal ishlab chiqishda ko'pincha virtual environment'ingiz (venv) bilan birga .env fayldan foydalanish qulay ekanini ko'rasiz.
Production'da
Production ilovalarini ishga tushirishda alohida bir foydalanuvchining .env fayliga tayanishdan saqlaning. Buning o'rniga ilovangiz ishlaydigan environment taqdim etadigan, production'ga xos konfiguratsiyalardan foydalaning. Secret management tizimi bilan ishlash production credential'laringizni yanada himoyalashga yordam beradi.
Production'da API key'lar kabi credential'lardan tashqari hosting platformalari va serverlar uchun konfiguratsiyalarni ham ko'rishingiz mumkin. Sozlash boshqacha bo'lsa ham, environment variable'larga baribir os.environ yoki os.getenv() orqali murojaat qilishingiz mumkin. Albatta, o'zgaruvchilaringizni qayerda saqlashingiz ilovangizni qanday deploy qilishingizga bog'liq. Cloud platformalar, container'lar va CI/CD pipeline'larning har biri environment variable'larni samarali boshqarish usullarini taqdim etadi.
Cloud'lar, container'lar va CI/CD
Zamonaviy deployment environment'lari, jumladan cloud platformalar, container'lar va CI/CD pipeline'larning environment variable'larni sozlashning o'z usullari bor. Odatda o'zgaruvchilaringizni ilovangizni deploy qilganingizda yoki ishga tushirganingizda taqdim etasiz.
Cloud platformalar Amazon Web Services (AWS), Microsoft Azure yoki Google Cloud kabi provider'lardan hisoblash yoki saqlash resurslarini ijaraga olish imkonini beradi. Cloud environment'larida ilovaga xos sozlamalarni taqdim etishingiz kerak bo'lishi mumkin, environment variable'lar esa bunday konfiguratsiyalar uchun qulay vosita bo'ladi. Cloud provider'larda ko'pincha parollar va key'lar kabi maxfiy ma'lumotlar uchun managed secret store'lar ham bo'ladi.
Har bir container'ning o'z environment'i bo'lgani uchun, environment variable'lar Docker kabi platformada container ishga tushirilayotganda unga maxsus sozlamalarni uzatish imkonini beradi. Xususan, Docker sizga ikkita qulay variant beradi va ikkalasi ham o'zgaruvchilarni Python kodingizga yoki container image'ingizga hard-code qilishdan qochadi.
Container'ingizni ishga tushirayotganda bitta o'zgaruvchi berishingiz mumkin:
docker run -e DATABASE_URL="my_database_url" my_image
Yoki bir nechta o'zgaruvchini taqdim etish uchun .env fayl yaratishingiz mumkin:
docker run --env-file .env my_image
Oxir-oqibat, environment variable'lar container'lar uchun juda yaxshi ishlaydi, chunki bir xil image'ni qayta ishlatib, uning konfiguratsiyasini runtime'da o'zgartirishingiz mumkin.
CI/CD pipeline'larda ko'pincha ilovalarni build qilish, testlash va deploy qilish uchun alohida environment'lar bo'ladi, shuning uchun yana environment variable'lar bu tizimlarga juda mos keladi: har bir turdagi environment'ga turli konfiguratsiya va credential'larni berishingiz mumkin. GitHub Actions kabi ba'zi CI/CD platformalari secret'laringizni source code'ingizdan alohida aniq saqlash imkonini beradi va ularni faqat pipeline'ingizdagi job'larga, jumladan environment variable sifatida ham, taqdim etadi.
Qaysi deployment environment'ini tanlamang, kodingiz ichidan environment variable'larga os module'idagi os.environ yoki os.getenv() yordamida murojaat qilishda davom etishingiz mumkin. Faqat ularni platformangizning xavfsizlik bo'yicha best practice'lariga amal qilgan holda source code'ingizdan tashqarida sozlaysiz.
Secret'larni boshqarish va best practice'lar
Ilovangiz va secret'laringizni xavfsiz saqlash uchun hech qanday parol, API key yoki boshqa credential'larni to'g'ridan-to'g'ri Python script'laringizga hard-code qilmang. Buning o'rniga, bu konfiguratsiyalarni source code'ingizdan alohida saqlash uchun environment variable'larga tayanishingiz mumkin.
Maxfiy ma'lumotlarni hech qachon version control repository'lariga commit qilmang, ayniqsa GitHub kabi platformalarda ommaga ochiq joylashtirmoqchi bo'lgan repository'larga. Agar o'zgaruvchilaringizni ommaviy saqlash uchun .env fayl yaratsangiz, loyiha fayllarini GitHub'ga push qilishdan oldin uni .gitignore'ga qo'shishni unutmang. Bu, hatto hamma narsani qo'shish uchun git add . ni ishga tushirib yuborsangiz ham, secret'laringizni tasodifan yuklab yuborishning oldini olishga yordam beradi.
Ehtimol, har bir environment turi (development, testing, staging va production) uchun alohida credential'lar va konfiguratsiyalar kerak bo'ladi. Production environment'iga deploy qilingan ilovalar uchun esa secrets manager'dan foydalanib ko'ring. Va nihoyat, log'laringiz yoki xato xabarlaringizga hech qanday maxfiy ma'lumot qo'ymaslikni unutmang — kim biladi, oxir-oqibat ularni qaysi foydalanuvchi ko'rib qolishi mumkin!
Keng tarqalgan xatolarni troubleshooting qilish
Tan olish kerak, Python script'ingizdan tashqarida saqlangan ma'lumotlar bilan ishlash ancha asabni buzadigan bug'larga olib kelishi mumkin. Quyida Python'da environment variable'larni sozlash va boshqarishda duch keladigan eng keng tarqalgan bug'lardan bir nechtasi va ularning har birining yechimi keltirilgan.
Agar loyihangizning .env faylida saqlagan qiymatlaringiz kodingizga yuklanmasa, python-dotenv'ni o'rnatganingizga ishonch hosil qiling. Shuningdek, script'ingizda python-dotenv kutubxonasidagi load_dotenv()'ni chaqirganingizni ham qayta tekshiring. Ikkalasini ham qilgan bo'lsangiz, .env faylingiz kutilgan joyda, masalan, loyiha papkangizda turganini tekshirib ko'ring. Tizimingizdagi doimiy environment variable'ni .env faylingizdagi o'zgaruvchi bilan bir xil nomlab qo'ymaganingizga ishonch hosil qiling; load_dotenv() default holatda mavjud o'zgaruvchilarni qayta yozmaydi.
Doimiy o'zgaruvchilar haqida gapirganda, ba'zan ular ko'rinmaydi, chunki Python'dan script'ingizni ishga tushirishni so'rashdan oldin yangi terminal oynasini ochishingiz yoki shell konfiguratsiyangizni qayta yuklashingiz kerak bo'ladi. Shuningdek, o'zgaruvchini aynan siz foydalanayotgan shell'ning konfiguratsiya fayliga qo'shganingizni ham tekshirishingiz mumkin. Masalan, .zshrc'ni tahrirlab, Python'ni bash'dan ishga tushirsangiz, o'zgaruvchingizdan foydalana olmaysiz.
Shuni ham yodda tutingki, os.environ va os.getenv() Python environment variable'laringizni string sifatida qaytaradi. Bu API URL'lari yoki key'lar kabi elementlar uchun mantiqli, lekin agar o'zgaruvchi, masalan, port raqamini ko'rsatishi kerak bo'lsa, uni integer'ga aniq konvertatsiya qilishingiz kerak bo'ladi. Bu yerda biz port'ni "5000" string default qiymati bilan olish uchun os.getenv()'dan foydalandik, so'ng uni integer'ga konvertatsiya qildik:
import os
port = int(os.getenv("PORT", "5000"))
Xulosa
Environment variable'lar — Python kodidan tashqarida yashaydigan, saqlangan key-value juftliklari. Ular odatda ma'lumotlar bazasi URL'lari yoki API key'lar kabi konfiguratsiya va credential ma'lumotlarini saqlaydi. Ularni Python script'idan vaqtinchalik, operatsion tizimingiz yoki shell konfiguratsiyangiz orqali doimiy, yoki Python loyihangizning barcha environment variable'lari uchun .env faylda o'rnatishingiz mumkin. Ularga kodingizdan Python'ning os module'i orqali murojaat qiling: os.environ'dan yoki KeyError'dan qochish uchun os.getenv() funksiyasidan foydalaning.
Environment variable'lar konfiguratsiya va credential'larni turli environment'lar o'rtasida almashtirishda foydali ekanini ko'rasiz, shuningdek, ularni cloud ilovalaringiz uchun ham taqdim etishingiz mumkin. Faqat parollar yoki API key'lar kabi hech qanday maxfiy ma'lumotni GitHub'ga joylamasligingizga ishonch hosil qiling. Production ilovalari uchun maxsus secrets manager'dan foydalanishni tanlashingiz mumkin.
Shularning barchasidan keyin ham Python'dagi environment variable'larni to'liq tushunish uchun o'rganadigan narsalar hali ko'p. Ko'proq ma'lumot olish uchun AI Tutor'dan bemalol so'rang, quyidagi prompt'dan boshlab: