Python’da (os.environ) ortam değişkenlerini alma, ekleme, üzerine yazma ve silme

Ortam değişkenleri, os.environ kullanılarak Python programlarında alınabilir, kontrol edilebilir, ayarlanabilir (eklenebilir veya üzerine yazılabilir) ve silinebilir. Ortam değişkenlerini ayarlayarak veya silerek yapılan değişikliklerin yalnızca Python programında etkili olduğunu unutmayın. Bu, sistem ortamı değişkenlerinin yeniden yazılacağı anlamına gelmez.

Aşağıdaki bilgiler burada verilmiştir.

  • os.environ
  • Ortam değişkenlerini alın.
  • Ortam değişkenlerini ayarla (ekle/üzerine yaz)
  • Ortam değişkenlerini kaldırın
  • Değişen ortam değişkenlerinin etkisi
  • İşlemleri ortam değişkenlerine göre değiştirme

İşletim sistemi modülünü içe aktarın ve kullanın. Standart bir kütüphane olduğu için ek bir kurulum gerektirmez. Alt süreç modülü de standart kitaplığa dahil edilmiştir.

import os
import subprocess

işletim sistemi

os.environ türü os._Environ’dur.

print(type(os.environ))
# <class 'os._Environ'>

os._Environ, bir çift anahtar ve değere sahip bir harita tipi nesnedir ve sözlükle (dict type) aynı yöntemlere sahiptir. Ortam değişkeni adı anahtardır ve değeri değerdir.

os.environ içeriği, os modülü içe aktarıldığında yüklenecektir. Program çalışırken sistem ortam değişkenleri başka yollarla değiştirilse bile os.environ içeriği güncellenmeyecektir.

Liste print() ile görüntülenir.

# print(os.environ)

Sözlükte olduğu gibi, aşağıdaki yöntemleri kullanabilir veya anahtarların ve değerlerin varlığını kontrol etmek için kullanabilirsiniz.

  • keys()
  • values()

Anahtarların ve değerlerin işlenmesi temelde sözlüklerle aynıdır. Örnekler aşağıda verilmiştir.

Ortam değişkenlerini alın.

os.environ[Environment variable name]
Bu, ortam değişkeninin değerini almanızı sağlar, ancak mevcut olmayan bir ortam değişkeni adı belirtirseniz bir hata alırsınız (KeyError).

print(os.environ['LANG'])
# ja_JP.UTF-8

# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'

os.environ’ın get() yöntemi, yoksa varsayılan değeri almak için kullanılabilir. Bu aynı zamanda sözlük gibidir.

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() işlevi de sağlanır. Sözlüğün get() yöntemi gibi, anahtar yoksa varsayılan değeri döndürür. Bu işlev, yalnızca bir ortam değişkeninin değerini almak ve kontrol etmek istiyorsanız kullanışlıdır.

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

Ortam değişkenlerini ayarla (ekle/üzerine yaz)

os.environ[Environment variable name]
Buna bir değer atayarak bir ortam değişkeni belirleyebilirsiniz.

Yeni bir ortam değişkeni adı belirtildiğinde ortam değişkeni yeni eklenir ve mevcut bir ortam değişkeni adı belirtildiğinde ortam değişkeninin değerinin üzerine yazılır.

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

Bir dize dışında herhangi bir şey atamanın bir hataya (TypeError) yol açacağını unutmayın. Sayısal bir değer atamak istiyorsanız, bunu bir dize olarak belirtin.

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

os.putenv() işlevi de sağlanır. Ancak os.environ değeri, os.putenv() tarafından ayarlandığında güncellenmez. Bu nedenle, os.environ’un anahtarını (ortam değişkeni adı) belirtmek ve yukarıdaki örnekte gösterildiği gibi değer atamak tercih edilir.

putenv() destekleniyorsa, os.environ’daki bir öğeye yapılan atama otomatik olarak karşılık gelen putenv() çağrısına dönüştürülür. Pratikte os.environ’da bir öğeye atamak tercih edilen işlemdir, çünkü putenv()’e doğrudan bir çağrı os.environ’u güncellemeyecektir.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Daha önce de belirtildiği gibi, ortam değişkenleri ekleyerek veya üzerine yazarak yapılan değişiklikler yalnızca Python programı içinde etkilidir. Bu, sistem ortamı değişkenlerinin yeniden yazılacağı anlamına gelmez.

Değeri değiştirmenin işletim sistemine bağlı olarak bellek sızıntısına neden olabileceğini unutmayın.

Not: FreeBSD ve Mac OS X dahil olmak üzere bazı platformlarda environ değerinin değiştirilmesi bellek sızıntısına neden olabilir.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Bu, işletim sisteminin kendisinin putenv() özelliğinden kaynaklanmaktadır.

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)

Ortam değişkenlerini kaldırın

Bir ortam değişkenini silmek için os.environ’ın pop() yöntemini veya del ifadesini kullanın. Aynı sözlük gibi.

Aşağıda bir pop() örneği verilmiştir.

pop() silinen ortam değişkeninin değerini döndürür. Varsayılan olarak, var olmayan bir ortam değişkeninin belirtilmesi bir hataya (KeyError) neden olur, ancak ikinci bağımsız değişkenin belirtilmesi, yoksa ortam değişkeninin değerini döndürür.

print(os.environ.pop('NEW_KEY'))
# 100

# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'

print(os.environ.pop('NEW_KEY', None))
# None

Aşağıdaki del örneğidir.

Ortam değişkeni tekrar eklenir ve ardından silinir. Ortam değişkeni yoksa, bir hata (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() işlevi de sağlanır. Ancak, os.putenv() ile olduğu gibi, os.environ değeri os.unsetenv() tarafından silindiğinde güncellenmez. Bu nedenle, os.environ’un anahtarını (ortam değişkeni adı) belirtmek ve yukarıdaki örnekte gösterildiği gibi silmek tercih edilir.

unsetenv() destekleniyorsa, os.environ’da bir öğenin silinmesi, otomatik olarak karşılık gelen unsetenv() çağrısına çevrilecektir. Uygulamada, unsetenv()’e yapılan doğrudan çağrılar os.environ’u güncellemeyeceğinden, os.environ’daki öğeleri silmek tercih edilen işlemdir.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Ortam değişkenlerini silmek de yalnızca o Python programında etkilidir. Sistem ortamı değişkenlerini kaldırmaz.

Değişen ortam değişkenlerinin etkisi

Defalarca yazdığım gibi os.environ ortam değişkenini değiştirmek (ayarlamak veya silmek) sistem ortam değişkenini değiştirmez ancak programda başlatılan alt süreçleri etkiler.

LANG ortam değişkeni olmadığından ve date komutunun içeriği farklı olduğundan aşağıdaki kod Windows’ta beklendiği gibi çalışmayacaktır.

Alt işlem modülünde date komutunun çağrılması.

Date komutunun çıktı sonucu, LANG ortam değişkeninin değerine bağlı olarak değişir.

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
# 

Açıklama amacıyla, os.environ’daki LANG ortam değişkenini değiştirdik, ancak Python, yerel ayarı kontrol etmek için bir yerel ayar modülü sağlar.

İşlemleri ortam değişkenlerine göre değiştirme

Bir ortam değişkeninin değerine göre süreci değiştirmek de mümkündür.

Dil ayarlarında LANG ortam değişkenine göre çıktıyı değiştirmeye bir örnek. Burada, dizenin belirtilen dizeyle başlayıp başlamadığını belirlemek için startwith() yöntemini kullanıyoruz, ancak tam eşleşmeyi belirlemek istiyorsanız karşılaştırmak için “==” kullanabilirsiniz.

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')
# こんにちは

Ayrıca ortam değişkenleri örneğin geliştirme ortamını ve üretim ortamını gösterecek şekilde ayarlanmışsa, bu değişkenlerin değerlerini alabilir ve süreci değiştirebilirsiniz.