Байгаль орчны хувьсагчдыг os.environ ашиглан Python програм дээр татаж авах, шалгах, тохируулах (нэмэх эсвэл дарж бичих), устгах боломжтой. Хүрээлэн буй орчны хувьсагчдыг тохируулах эсвэл устгах замаар хийсэн өөрчлөлт нь зөвхөн Python програмын хүрээнд хүчинтэй болохыг анхаарна уу. Энэ нь системийн орчны хувьсагчдыг дахин бичнэ гэсэн үг биш юм.
Дараахь мэдээллийг энд оруулав.
os.environ
- Байгаль орчны хувьсагчдыг авах.
- Орчны хувьсагчдыг тохируулах (нэмэх/дарах)
- Байгаль орчны хувьсагчдыг устгах
- Байгаль орчны хувьсагчдын өөрчлөлтийн нөлөө
- Үйл явцыг орчны хувьсагчуудаар солих
OS модулийг импортлох ба ашиглах. Энэ нь стандарт номын сан учраас нэмэлт суулгах шаардлагагүй. Дэд процессийн модулийг мөн стандарт номын санд оруулсан болно.
import os
import subprocess
os.environ
Os.environ -ийн төрөл нь os._Environ юм.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ нь хос түлхүүр, утгатай газрын зургийн төрөл обьект бөгөөд толь бичигтэй ижил аргуудыг агуулдаг (dict төрөл). Хүрээлэн буй орчны хувьсагчийн нэр нь түлхүүр бөгөөд түүний утга нь утга юм.
Os модулийг импортлох үед os.environ -ийн агуулгыг ачаалах болно. Хөтөлбөр ажиллаж байх үед системийн орчны хувьсагчдыг өөр аргаар өөрчилсөн байсан ч os.environ -ийн агуулга шинэчлэгдэхгүй.
Жагсаалтыг print () хэлбэрээр харуулна.
# print(os.environ)
Толь бичгийн нэгэн адил та дараах аргуудыг ашиглаж болно, эсвэл түлхүүр, утга байгаа эсэхийг шалгахын тулд in ашиглаж болно.
keys()
values()
Түлхүүр ба утгыг боловсруулах нь үндсэндээ толь бичигтэй ижил байдаг. Жишээнүүдийг доор өгөв.
Байгаль орчны хувьсагчдыг авах.
os.environ[Environment variable name]
Энэ нь танд орчны хувьсагчийн утгыг авах боломжийг олгоно, гэхдээ хэрэв та байхгүй орчны хувьсагчийн нэрийг зааж өгвөл алдаа гарна (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Os.environ -ийн get () аргыг хэрэв байхгүй бол анхдагч утгыг авахад ашиглаж болно. Энэ нь толь бичигтэй мөн адил юм.
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 () функцийг бас өгсөн болно. Толь бичгийн get () аргын нэгэн адил түлхүүр байхгүй тохиолдолд анхдагч утгыг буцаана. Хэрэв та зөвхөн орчны хувьсагчийн утгыг олж, шалгахыг хүсч байвал энэ функц ашигтай болно.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Орчны хувьсагчдыг тохируулах (нэмэх/дарах)
os.environ[Environment variable name]
Үүнд утгыг өгснөөр та орчны хувьсагчийг тохируулж болно.
Шинэ орчны хувьсагчийн нэрийг зааж өгөхөд орчны хувьсагчийг шинээр нэмж, одоо байгаа орчны хувьсагчийн нэрийг зааж өгөхөд орчны хувьсагчийн утгыг дарж бичнэ.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Тэмдэгт мөрөөс өөр зүйлийг оноож өгвөл алдаа гарна гэдгийг анхаарна уу (TypeError). Хэрэв та тоон утга оноохыг хүсвэл үүнийг мөр болгон зааж өгнө үү.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Os.putenv () функцийг бас өгсөн болно. Гэхдээ os.environ -ийн утга os.putenv () -ээр тохируулагдсан үед шинэчлэгддэггүй. Энэ шалтгааны улмаас os.environ -ийн түлхүүрийг (орчны хувьсагчийн нэр) зааж, дээрх жишээн дээр үзүүлсэн шиг утгыг оноож өгөх нь зүйтэй.
Хэрэв putenv () дэмжигдсэн бол os.environ дахь зүйлийн даалгаврыг автоматаар putenv () руу холбогдох дуудлага болгон хөрвүүлнэ. Практик дээр putenv () руу шууд залгах нь os.environ -ийг шинэчлэхгүй тул os.environ дахь зүйлд оноох нь илүү тохиромжтой үйлдэл юм.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Өмнө дурьдсанчлан орчны хувьсагчдыг нэмэх эсвэл дарж бичих замаар хийсэн өөрчлөлт нь зөвхөн Python програмын хүрээнд хүчинтэй байдаг. Энэ нь системийн орчны хувьсагчдыг дахин бичнэ гэсэн үг биш юм.
Утгыг өөрчлөх нь 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)
Байгаль орчны хувьсагчдыг устгах
Хүрээлэн буй орчны хувьсагчийг устгахын тулд os.environ -ийн pop () аргыг эсвэл del хэллэгийг ашиглана уу. Толь бичигтэй адил.
Дараахь зүйл бол поп () -ийн жишээ юм.
pop () нь устгагдсан орчны хувьсагчийн утгыг буцаана. Анхдагч байдлаар, байхгүй байгаа орчны хувьсагчийг зааж өгснөөр алдаа гарна (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 -ийн жишээ юм.
Хүрээлэн буй орчны хувьсагчийг дахин нэмж, дараа нь устгана. Хэрэв орчны хувьсагч байхгүй бол алдаа (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 () функцийг бас өгсөн болно. Гэсэн хэдий ч os.putenv () -ийн нэгэн адил os.unviren () устгаснаар os.environ -ийн утга шинэчлэгддэггүй. Тиймээс os.environ -ийн түлхүүрийг (орчны хувьсагчийн нэр) зааж өгөөд дээрх жишээнд үзүүлсэн шиг устгах нь зүйтэй.
Хэрэв unsetenv () дэмжигдсэн бол os.environ доторх зүйлийг устгаснаар unsetenv () руу холбогдох дуудлага руу автоматаар шилжих болно. Практик дээр, unsetenv () руу шууд дуудлага хийх нь os.environ -ийг шинэчлэхгүй тул os.environ дахь зүйлсийг устгах нь илүү тохиромжтой үйлдэл юм.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Байгаль орчны хувьсагчдыг устгах нь зөвхөн Python програмын хүрээнд үр дүнтэй байдаг. Энэ нь системийн орчны хувьсагчдыг устгадаггүй.
Байгаль орчны хувьсагчдын өөрчлөлтийн нөлөө
Миний давтан бичсэнчлэн os.environ орчны хувьсагчийг өөрчлөх (тохируулах эсвэл устгах) нь системийн орчны хувьсагчийг өөрчилдөггүй, гэхдээ энэ нь програмд эхлүүлсэн дэд процессуудад нөлөөлдөг.
Дараах код нь Windows дээр хүлээгдэж буй байдлаар ажиллахгүй, учир нь LANG орчны хувьсагч байхгүй бөгөөд огнооны командын агуулга өөр байна.
Дэд процесс модуль дахь огнооны командыг дуудаж байна.
Огноо тушаалын гаралтын үр дүн нь LANG орчны хувьсагчийн утгаас хамаарч өөрчлөгддөг.
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
#
Тайлбарлахын тулд бид os.environ дахь LANG орчны хувьсагчийг өөрчилсөн боловч Python нь локал хэлийг хянахын тулд локал модулийг өгдөг.
Үйл явцыг орчны хувьсагчуудаар солих
Мөн орчны хувьсагчийн утгын дагуу процессыг өөрчлөх боломжтой.
Хэлний тохиргоон дахь LANG орчны хувьсагчийн дагуу гаралтыг өөрчлөх жишээ энд байна. Энд бид startwith () аргыг ашиглан мөр нь заасан мөрөөс эхэлж байгаа эсэхийг тодорхойлох болно, гэхдээ хэрэв та яг таарч байгааг тодорхойлохыг хүсвэл “==” ашиглан харьцуулж болно.
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')
# こんにちは
Нэмж дурдахад хэрэв хүрээлэн буй орчны хувьсагчдыг хөгжлийн орчин ба үйлдвэрлэлийн орчныг харуулахаар тохируулсан бол та эдгээр хувьсагчдын утгыг авч, процессыг сольж болно.