Ana içeriğe geç

Python Ortam Değişkenleri: Bilmeniz Gerekenler

os ve python-dotenv kütüphaneleriyle Python ortam değişkenlerini yönetmenin inceliklerini öğrenin.
· 9 dk. oku

Yapay Zeka ile Keşfedin

Ortam değişkenleri, geliştirme projenizin yapılandırma ayrıntılarını esnek ve güvenli bir şekilde saklamak için güçlü bir mekanizmadır. Python gibi programlama dilleri tarafından erişilebilen anahtar-değer çiftlerini saklar ve bu bilgileri meraklı gözlerden gizli tutar. Bu eğitimde, Python'da ortam değişkenleri oluşturmak ve yönetmek için bilmeniz gereken kavram ve teknikleri öğreneceksiniz.

Ortam Değişkenleri Nedir?

Ortam değişkenleri, işletim sisteminizde güvenli bir yerde saklanan ad-değer çiftleridir. Çoğunlukla şu şekilde görünürler:

API_KEY=1akn4nka-aqwej3

Python'da bu tür değişkenleri, geliştirme projenizle ilgili hassas bilgileri saklamak için kullanabilirsiniz. Hassas bilgilere şu örnekler verilebilir:

  • Başka uygulamalara erişmek için API anahtarları
  • Betikler aracılığıyla uygulamalara giriş yapmak için kullanıcı adları ve parolalar
  • Veritabanı kimlik bilgileri
  • yanlışlıkla açığa çıkarsa güvenlik sorununa yol açabilecek her şey.

Örneğin, AWS kimlik bilgilerinizi açıkça kullanan bir Python betiği yazıp bu betiği yanlışlıkla GitHub'a gönderirseniz, kötü niyetli kişilerin bunu keşfetmesi ve AWS faturanızın ciddi şekilde artması mümkündür (bunun yaşandığı biliniyor).

Ortam değişkenlerinin bir diğer faydası da yapılandırılabilir olmalarıdır. Ortam değişkenlerini düzenleyerek ayarları (veritabanı URL'leri, dosya yolları) kodu değiştirmeden kolayca ayarlayabilirsiniz. Bu özellik, aynı ayarı projenizin birden çok bölümünde kullanıyorsanız özellikle faydalıdır.

Öyleyse, Python'da onlarla nasıl çalışacağımızı öğrenelim.

Python'un os Modülünde Ortam Değişkenleri Nasıl Alınır

İşletim sisteminizde mevcut ortam değişkenlerini almak için os modülünü kullanabilirsiniz. Değişkenleri almak için .getenv işlevine sahiptir:

import os
os.getenv("USER")
'bexgboost'

Yukarıda, tüm sistemlerde yerleşik olan sistem kullanıcı adını alıyorum. Ev yolu gibi daha birçok değişken vardır:

os.getenv("HOME")
'/home/bexgboost'

Ya da Conda yürütülebilir dosyanızın yolu:

os.getenv("CONDA_EXE")
'/home/bexgboost/anaconda3/bin/conda'

Dolayısıyla conda komutlarını çalıştırdığınızda, terminaliniz hangi uygulamanın çalıştırılacağını bu şekilde bilir.

Peki, var olmayan bir değişkeni almaya çalışırsanız ne olur:

os.getenv("MYDATABASE")

.getenv() işlevi hiçbir şey döndürmez, ancak bu davranışı değiştirebiliriz. Bir değişken yoksa özel bir değer döndürmek için onun default parametresini kullanabilirsiniz:

os.getenv("COMPUTER_PASSWORD", default="Nope!")
'Nope!'

.getenv() işlevi, mevcut değişkenleri almak için en iyi yöntemdir.

Bununla birlikte, başka kaynaklarda tüm ortam değişkenlerini içeren bir sözlük döndüren .environ özniteliği gibi farklı yöntemler görebilirsiniz:

current_directory = os.environ.get("PWD", None)
current_directory
'/home/bexgboost/articles/2024/4_april'

Bir sözlük olduğundan, (önerilmez) köşeli ayraç gösterimini veya bir değeri almak için .get() işlevini kullanabilirsiniz.

os, muhtemelen en önemli sistem değişkeni olan PATH'e de erişebilir. PATH, sisteminizde yüklü tüm yürütülebilir dosyaların mutlak yollarını tutar, bu yüzden epey uzundur:

os.getenv("PATH")[:46]
'/home/bexgboost/.local/bin:/home/bexgboost/bin'

PATH içindeki her yol iki nokta ile ayrılır. Sistemimdeki PATH'in uzunluğunu sayalım:

def count_path_items():
   items = os.getenv("PATH").split(":")

   return len(items)

count_path_items()
79

79! Fena değil.

Python'da Ortam Değişkenlerini Etkin Şekilde Yönetmek için python-dotenv Kütüphanesini Kullanma

Özel ortam değişkenleri ayarlama

Artık mevcut değişkenleri nasıl çıkaracağımızı bildiğimize göre, özel olanları nasıl ayarlayacağımıza bakalım. İlk yöntem os.environ sözlüğünü kullanmaktır:

# Create a new environment variable
os.environ["NEW_VARIABLE"] = "42"  # Always expects a string value

os.getenv("NEW_VARIABLE")
'42'

Ancak bu yöntem çok kullanışlı değildir; çünkü tüm yeni değişkenler mevcut oturum sona erdiğinde kaybolacaktır.

Neyse ki, .env dosyalarını (nokta-env diye okunur) kullanarak ortam değişkenlerini daha kalıcı bir şekilde saklama yöntemi vardır. Bu dosyalar aynı sözdizimine sahiptir; bu da herhangi bir işletim sisteminde çalışacakları anlamına gelir. Örnek bir .env dosyası şöyle görünür:

CUSTOM_API_LINK=https://myapi.com/v1/api
SNOWFLAKE_USERNAME=bexgboost
MYSQL_DATABASE_PASSWORD=as3ndf03

Şimdilik yalnızca üç değişken tanımlıyor. Bu dosyayı okuyup içeriğini çıkarmak için python-dotenv adlı bir kütüphane kullanacağız:

$ pip install python-dotenv

Ardından, bir Python betiğinde veya Jupyter Notebook'ta load_dotenv işlevini içe aktaracak ve çağıracağız:

from dotenv import load_dotenv

load_dotenv()
True

Geçerli dizinde bir .env dosyası bulamazsa, tüm üst dizinlerde arar ve bulursa True döndürür.

Yukarıdaki .env dosyasını ev dizinimde ~/.env olarak sakladım; bu nedenle load_dotenv onu bulabildi.

Kendi dosyalarınızı oluşturmak için terminalde touch komutunu kullanabilir veya VSCode gibi bir metin düzenleyici kullanabilirsiniz:

$ touch ~/.env

.env dosyalarının sözdizimi oldukça esnektir. Örneğin, çok satırlı değerlere sahip değişkenler ayarlayabilirsiniz (tırnak işareti olmalı):

LONG_ENV="This is an environment
variable with a long message"

Kaçış karakterleri kullanın:

LONG_ENV="This value uses an \"escape character"

Ayrıca dosyaya, ileride başvurmak üzere yorumlar da ekleyebilirsiniz:

# You can also add comments anywhere with a hashtag
CUSTOM_API_LINK=https://myapi.com/v1/api
SNOWFLAKE_USERNAME=bexgboost
MYSQL_DATABASE_PASSWORD=as3ndf03

${VAR_NAME} sözdizimini kullanarak bir değişkenin değerini başka bir değişkenin içinde kullanmak da mümkündür:

FIRST_NAME=John
LAST_NAME=Doe
FULL_NAME="I am ${FIRST_NAME} ${LAST_NAME}"

python-dotenv ile özel ortam değişkenlerini alma

Özel değişkenleri almak öncekilerle aynıdır - sadece os modülünü kullanın:

import os

os.getenv("CUSTOM_API_LINK")
'https://myapi.com/v1/api'
os.getenv("SNOWFLAKE_USERNAME")
'bexgboost'

load_dotenv çağrısını önce yaptığınızdan emin olun.

.env dosyanız load_dotenv'in erişemeyeceği bir yerdeyse, aşağıdaki gibi doğrudan yolunu geçebilirsiniz:

load_dotenv("/home/bexgboost/somewhere/unreachable/.env")
True

Jupyter'da .env dosyalarıyla çalışmak

Python-dotenvi kurduktan sonra, Jupyter kullanıyorsanız Python'a içe aktarmanız gerekmez. Kütüphane, onu otomatik olarak yükleyen bir Jupyter magic yöntemi ile birlikte gelir:

# Run this anywhere in the notebook to load EVs from .env
%load_ext dotenv
%dotenv

Sonrasında yine os modülünü kullanabilirsiniz:

import os

os.getenv("SNOWFLAKE_USERNAME")
'bexgboost'

Python'da Ortam Değişkenlerini Kullanma İçin En İyi Uygulamalar

Bu bölümde, ortam değişkenlerinin güvenli ve tam olarak kullanılabilir kalmasını sağlamak için bazı en iyi uygulamaları listeleyeceğiz.

1. .env dosyalarını her zaman .gitignore'a ekleyin; böylece onları yanlışlıkla GitHub'a göndermemiş olursunuz.

# Create .gitignore if it doesn't exist
$ touch .gitignore
$ echo ".env" >> .gitignore

2. Değişkenleri tanımlarken açıklayıcı ve TAMAMEN BÜYÜK HARF adlar kullanın.

# Good
DEBUG=True
LOGGING_VERBOSITY=3

# Bad
debug=True
LV=3

3. Her projede ihtiyaç duyduğunuz sistem genelindeki değişkenleri saklamak için tek bir .env dosyası oluşturun.

$ touch ~/.env

4. .env dosyalarınızın kapsamını yönetin. Aşağıdaki gibi, geliştirme iş akışınızın farklı bölümleri için ayrı dosyalar oluşturun:

$ touch development/.env.development
$ touch testing/.env.testing
$ touch production/.env.production

load_dotenv bunları tanıyacaktır.

Farklı adlara sahip birden fazla .env dosyası oluşturursanız, bunların tümünün git indekslemesinden hariç tutulması için .gitignore dosyanızı değiştirin:

# Pay attention to the asterisk *
$ echo ".env*" >> .gitignore

Sonuç

Bu yazıda, Python'da ortam değişkenlerini etkin şekilde yönetmek için gerekli tüm temel kavram ve teknikleri öğrendik. Mevcut değişkenleri Python OS modülüyle nasıl alacağımızı ve python-dotenv kütüphanesiyle özel değerleri nasıl oluşturacağımızı keşfettik. Ayrıca en iyi uygulamalara uygun .env dosyaları yazmayı da öğrendik.

Python yazılım mühendisliği hakkında daha fazla bilgi edinmek istiyorsanız, Python'da Yazılım Mühendisliği İlkeleri kursumuza göz atın.

Ayrıca sizi başlangıç seviyesinden ileri seviyeye taşıyacak uygulamalı alıştırmalar ve projeler içeren Python Programlama Beceri Yolumuzu da inceleyebilirsiniz.

Bexruz (Bex) Tuychiev

Yazar

Bexruz (Bex) Tuychiev

2 yılı aşkın deneyime sahip bir veri bilimi içerik üreticisiyim ve Medium’da en büyük takipçi kitlelerinden birine sahibim. Yapay zekâ ve makine öğrenimi üzerine, biraz da alaycı bir üslupla yazılmış, ayrıntılı makaleler kaleme almayı seviyorum; çünkü onları biraz daha az sıkıcı hale getirmek için bir şeyler yapmak gerekiyor. 130’un üzerinde makale ve bir de DataCamp kursu ürettim; bir diğeri de hazırlık aşamasında. İçeriklerim 5 milyondan fazla kişi tarafından görüldü; bunların 20 bini Medium ve LinkedIn’de takipçim oldu. 

Konular

İlgili