os.environ ကို သုံး၍ Python ပရိုဂရမ်များတွင်သဘာဝပတ်ဝန်းကျင်ဆိုင်ရာကိန်းရှင်များကိုပြန်လည်ရယူ၊ စစ်ဆေး၊ သတ်မှတ် (ထပ်ပေါင်း (သို့) ထပ်ရေး)) နှင့်ဖျက်နိုင်သည်။ Python program အတွင်း setting များသို့မဟုတ်ဖျက်ခြင်းဖြင့်ပြုလုပ်သောအပြောင်းအလဲများသည် Python program အတွင်း၌သာထိရောက်ကြောင်းသတိပြုပါ။ system environment variables များကိုပြန်လည်ရေးသားလိမ့်မည်ဟုမဆိုလိုပါ။
အောက်ပါအချက်အလက်များကိုဤနေရာတွင်ဖော်ပြထားသည်။
os.environ
- ပတ်ဝန်းကျင်ကိန်းရှင်များကိုရယူပါ။
- (add/overwrite) environment variable များကိုသတ်မှတ်ပါ
- ပတ်ဝန်းကျင်ကိန်းရှင်များကိုဖယ်ရှားပါ
- ပြောင်းလဲနေသောပတ်ဝန်းကျင်ကိန်းရှင်များ၏သက်ရောက်မှု
- ပတ်ဝန်းကျင်ကိန်းရှင်များအရလုပ်ငန်းစဉ်များပြောင်းလဲခြင်း
os module ကိုတင်သွင်းပြီးသုံးပါ။ ၎င်းသည်စံစာကြည့်တိုက်ဖြစ်သောကြောင့်အပိုတပ်ဆင်ရန်မလိုအပ်ပါ။ subprocess module ကိုလည်း standard library တွင်ထည့်သွင်းထားသည်။
import os
import subprocess
os.en Environment
os.environ အမျိုးအစားသည် os._En Environment ဖြစ်သည်။
print(type(os.environ))
# <class 'os._Environ'>
os._Environ သည်သော့နှင့်တန်ဖိုးတစ်စုံပါသောမြေပုံအမျိုးအစားအရာဝတ္ထုဖြစ်ပြီးအဘိဓာန် (dict type) ကဲ့သို့တူညီသောနည်းလမ်းများရှိသည်။ environment variable name သည်အဓိကဖြစ်ပြီး၎င်း၏တန်ဖိုးသည်တန်ဖိုးဖြစ်သည်။
os module ကိုတင်သွင်းသောအခါ os.en Environment ၏အကြောင်းအရာများကိုတင်လိမ့်မည်။ ပရိုဂရမ်လည်ပတ်နေစဉ်တွင် system environment variables များကိုအခြားနည်းလမ်းများဖြင့်ပြောင်းလဲလျှင်တောင် os.en Environment ၏အကြောင်းအရာများသည်မွမ်းမံလိမ့်မည်မဟုတ်ပါ။
စာရင်းကို print () ဖြင့်ပြထားသည်။
# print(os.environ)
အဘိဓာန်တွင်ကဲ့သို့သင်အောက်ပါနည်းလမ်းများကိုသုံးနိုင်သည်၊ သို့မဟုတ်သော့များနှင့်တန်ဖိုးများတည်ရှိမှုကိုစစ်ဆေးရန်သုံးနိုင်သည်။
keys()
values()
သော့များနှင့်တန်ဖိုးများကိုလုပ်ဆောင်ခြင်းသည်အခြေခံအားဖြင့်အဘိဓာန်များနှင့်တူသည်။ ဥပမာများကိုအောက်တွင်ဖော်ပြထားသည်။
ပတ်ဝန်းကျင်ကိန်းရှင်များကိုရယူပါ။
os.environ[Environment variable name]
၎င်းသည်သင့်အား environment variable ၏တန်ဖိုးကိုရရှိရန်ခွင့်ပြုလိမ့်မည်၊ သို့သော်မင်းမရှိသော environment variable name ကိုသတ်မှတ်လျှင်အမှား (KeyError) ရလိမ့်မည်။
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
os.en Environment ၏ get () method ကို default မရှိလျှင် default value ရရန်သုံးနိုင်သည်။ ဒါကအဘိဓာန်နဲ့အတူတူပဲ။
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 () function ကိုလည်းပေးထားသည်။ အဘိဓာန်၏ get () method ကဲ့သို့သော့မရှိလျှင်၎င်းသည်မူလတန်ဖိုးကိုပြန်ပေးသည်။ သင်ကပတ်ဝန်းကျင် variable တစ်ခုရဲ့တန်ဖိုးကိုရယူပြီးစစ်ဆေးချင်ရင်ဒီ function ကအသုံးဝင်ပါတယ်။
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
(add/overwrite) environment variable များကိုသတ်မှတ်ပါ
os.environ[Environment variable name]
ဤအရာကိုတန်ဖိုးတစ်ခုသတ်မှတ်ခြင်းဖြင့်၊ သင်ပတ်ဝန်းကျင်အခြေအနေတစ်ခုကိုသတ်မှတ်နိုင်သည်။
environment variable name အသစ်တစ်ခုသတ်မှတ်လိုက်သောအခါ environment variable ကိုအသစ်ထပ်ထည့်ပြီးရှိပြီးသား environment variable name ကိုသတ်မှတ်လိုက်သောအခါ environment variable ၏တန်ဖိုးကိုရေးလိုက်သည်။
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
စာကြောင်း တစ်ခုမှလွဲ၍ အခြားအရာတစ်ခုကိုသတ်မှတ်ခြင်းသည်အမှား (TypeError) ကိုဖြစ်ပေါ်စေလိမ့်မည်ကိုသတိပြုပါ။ ဂဏန်းတန်ဖိုးတစ်ခုကိုသတ်မှတ်ချင်ရင်အဲဒါကို string တစ်ခုအနေနဲ့သတ်မှတ်ပါ။
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
os.putenv () function ကိုလည်းပေးထားသည်။ သို့သော် os.putenv () ကသတ်မှတ်သောအခါ os.en Environment ၏တန်ဖိုးကိုမွမ်းမံမထားပါ။ ဤအကြောင်းကြောင့် os.en Environment ၏သော့ချက် (environment variable name) ကိုသတ်မှတ်ရန်နှင့်အထက်ပါဥပမာတွင်ပြထားသည့်အတိုင်းတန်ဖိုးသတ်မှတ်ခြင်းသည်ပိုကောင်းသည်။
putenv () ကိုထောက်ခံလျှင် os.en Environment ရှိ item တစ်ခုသို့တာဝန်တစ်ခုကို putenv () သို့သက်ဆိုင်ရာခေါ်ဆိုမှုတစ်ခုအလိုအလျောက်ပြောင်းလိမ့်မည်။ put.v (သို့) တိုက်ရိုက်ခေါ်ဆိုမှုသည် os.environ ကိုမွမ်းမံသောကြောင့်လက်တွေ့တွင်၊ os.environ ရှိအရာတစ်ခုကိုသတ်မှတ်ခြင်းသည် ဦး စားပေးလုပ်ဆောင်ချက်ဖြစ်သည်။
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
စောစောကပြောခဲ့တဲ့အတိုင်းပတ်ဝန်းကျင် variable တွေကိုထပ်ပေါင်းခြင်း (သို့) ထပ်ရေးခြင်းဖြင့်ပြုလုပ်သောအပြောင်းအလဲများသည် Python program အတွင်း၌သာထိရောက်သည်။ system environment variables များကိုပြန်လည်ရေးသားလိမ့်မည်ဟုမဆိုလိုပါ။
တန်ဖိုးပြောင်းလဲခြင်းသည် OS ပေါ် မူတည်၍ မှတ်ဥာဏ်ယိုစိမ့်မှုဖြစ်စေနိုင်သည်ကိုသတိပြုပါ။
မှတ်ချက်။ ။ FreeBSD နှင့် Mac OS X အပါအ ၀ င်အချို့သောပလက်ဖောင်းများတွင်ပတ်ဝန်းကျင်တန်ဖိုးပြောင်းလဲခြင်းသည်မှတ်ဥာဏ်ယိုစိမ့်မှုကိုဖြစ်စေနိုင်သည်။
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
၎င်းသည် OS ကိုယ်တိုင်၏ putenv () သတ်မှတ်ချက်ကြောင့်ဖြစ်သည်။
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)
ပတ်ဝန်းကျင်ကိန်းရှင်များကိုဖယ်ရှားပါ
environment variable တစ်ခုကိုဖျက်ရန် os.en Environment သို့မဟုတ် del statement ၏ pop () method ကိုသုံးပါ။ အဘိဓာန်နှင့်တူသည်။
အောက်ပါသည် pop () ဥပမာတစ်ခုဖြစ်သည်။
pop () သည်ဖျက်လိုက်သော environment variable ၏တန်ဖိုးကိုပြန်ပေးသည်။ ပုံသေအားဖြင့်တည်ရှိခြင်းမရှိသောပတ်ဝန်းကျင်အက္ခရာကိုသတ်မှတ်ခြင်းသည်အမှားတစ်ခု (KeyError) ကိုဖြစ်ပေါ်စေလိမ့်မည်၊ သို့သော်ဒုတိယအငြင်းအခုံသတ်မှတ်ခြင်းမရှိလျှင်ပတ်ဝန်းကျင်ကိန်းရှင်၏တန်ဖိုးကိုပြန်ပေးလိမ့်မည်။
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
အောက်ပါသည် del ၏ဥပမာတစ်ခုဖြစ်သည်။
environment variable ကိုထပ်ထည့်ပြီးဖျက်ပစ်လိုက်သည်။ ပတ်ဝန်းကျင် variable မရှိလျှင်အမှား (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 () function ကိုလည်းပေးထားသည်။ သို့သော် os.putenv () ကဲ့သို့ os.unsetenv () အားဖျက်လိုက်သောအခါ os.en Environment ၏တန်ဖိုးကိုမွမ်းမံမထားပါ။ ထို့ကြောင့် os.en Environment ၏ key (environment variable name) ကိုသတ်မှတ်ပြီးအပေါ်ကဥပမာမှာပြထားတဲ့အတိုင်းဖျက်ပစ်တာကပိုကောင်းပါတယ်။
unsetenv () ကိုထောက်ခံလျှင် os.en Environment ရှိအရာတစ်ခုကိုဖျက်ခြင်းသည်သက်ဆိုင်ရာခေါ်ဆိုမှုကို unsetenv () သို့အလိုအလျောက်ဘာသာပြန်ပေးလိမ့်မည်။ လက်တွေ့တွင်၊ os.environ တွင်ပစ္စည်းများဖျက်ခြင်းသည် ဦး စားပေးလုပ်ဆောင်ချက်ဖြစ်သောကြောင့် unsetenv () သို့တိုက်ရိုက်ခေါ်ဆိုမှုများသည် os.en Environment ကိုမွမ်းမံလိမ့်မည်။
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Python program အတွင်းမှ environment variables များကိုဖျက်ခြင်းသည်လည်းထိရောက်မှုရှိသည်။ ၎င်းသည် system environment variables များကိုမဖယ်ရှားပါ။
ပြောင်းလဲနေသောပတ်ဝန်းကျင်ကိန်းရှင်များ၏သက်ရောက်မှု
ငါအကြိမ်ကြိမ်ရေးခဲ့သလို os.en Environment environment variable (system setting variable) ကိုပြောင်းလဲခြင်း (ဖျက်ခြင်း၊ ဖျက်ခြင်း) သည် system environment variable ကိုမပြောင်းလဲစေဘဲ program တွင်ဖွင့်ထားသောလုပ်ငန်းစဉ်ခွဲများကိုထိခိုက်စေသည်။
LANG environment variable မရှိတာနဲ့ date command ရဲ့ content တွေမတူတာကြောင့်အောက်ကကုဒ်တွေက Windows မှာမျှော်လင့်ထားတဲ့အတိုင်းအလုပ်မလုပ်ပါဘူး။
subprocess module တွင် date command ကိုခေါ်သည်။
LANG environment variable ၏တန်ဖိုးပေါ် မူတည်၍ date command ၏ output result သည်ပြောင်းလဲသွားသည်။
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
#
ရှင်းပြချက်အတွက်၊ ငါတို့သည် LANG environment variable ကို os.environ တွင်ပြောင်းခဲ့သည်၊ သို့သော် Python သည် locale ကိုထိန်းချုပ်ရန် locale module တစ်ခုပေးသည်။
ပတ်ဝန်းကျင်ကိန်းရှင်များအရလုပ်ငန်းစဉ်များပြောင်းလဲခြင်း
ပတ်ဝန်းကျင် variable တစ်ခု၏တန်ဖိုးအတိုင်းလုပ်ငန်းစဉ်ကိုပြောင်းနိုင်သည်။
ဘာသာစကား setting တွင် LANG environment variable အတိုင်း output ကိုပြောင်းလဲခြင်း၏ဥပမာတစ်ခုဖြစ်သည်။ ဒီနေရာမှာ string ကသတ်မှတ်ထားတဲ့ string နဲ့စမလားဆိုတာကိုဆုံးဖြတ်ဖို့ startwith () method ကိုသုံးနေတယ်၊ ဒါပေမယ့်မင်းအတိအကျကိုက်ညီချင်ရင်မင်းနှိုင်းယှဉ်ဖို့ “ ==” ကိုသုံးနိုင်တယ်။
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')
# こんにちは
ထို့အပြင်၊ ပတ်ဝန်းကျင်အခြေအနေများအားဖွံ့ဖြိုးတိုးတက်မှုပတ်ဝန်းကျင်နှင့်ထုတ်လုပ်မှုပတ်ဝန်းကျင်ကိုညွှန်ပြရန်သတ်မှတ်ထားလျှင်ဥပမာအားဖြင့်ဤကိန်းများ၏တန်ဖိုးများကို ရယူ၍ လုပ်ငန်းစဉ်ကိုပြောင်းနိုင်သည်။