Python (os.environ) ортасының айнымалыларын алу, қосу, қайта жазу және жою

Іскерлік

Ортаның айнымалыларын 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.environ мазмұны os модулі импортталған кезде жүктеледі. Бағдарлама жұмыс істеп тұрған кезде жүйелік ортаның айнымалылары басқа әдістермен өзгертілсе де os.environ мазмұны жаңартылмайды.

Тізім print () көмегімен көрсетіледі.

# print(os.environ)

Сөздіктегідей, сіз келесі әдістерді қолдана аласыз немесе кілттер мен мәндердің болуын тексеру үшін қолданыңыз.

  • keys()
  • values()

Кілттер мен мәндерді өңдеу негізінен сөздіктермен бірдей. Мысалдар төменде келтірілген.

Қоршаған орта айнымалыларын алыңыз.

os.environ[Environment variable name]
Бұл сізге қоршаған орта айнымалысының мәнін алуға мүмкіндік береді, бірақ егер сіз жоқ ортаның айнымалы атын көрсетсеңіз, сіз қате аласыз (KeyError).

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

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

Get.) әдісін os.environ, егер ол болмаса, әдепкі мәнді алу үшін қолдануға болады. Бұл сөздікпен бірдей.

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 () сәйкес шақыруға түрлендіріледі. Іс жүзінде, os.environ ішіндегі элементке тағайындау – бұл қолайлы операция, себебі putenv () -ке тікелей қоңырау os.environ жаңартылмайды.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Жоғарыда айтылғандай, ортаның айнымалы мәндерін қосу немесе қайта жазу арқылы енгізілген өзгерістер тек Python бағдарламасында тиімді болады. Бұл жүйелік ортаның айнымалылары қайта жазылады дегенді білдірмейді.

Мәннің өзгеруі ОЖ -ге байланысты жадтың ағып кетуіне әкелуі мүмкін екенін ескеріңіз.

Ескерту: Кейбір платформаларда, соның ішінде FreeBSD және Mac OS X, ортаның мәнін өзгерту жадтың ағып кетуіне әкелуі мүмкін.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Бұл ОЖ -нің 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 () мысалы келтірілген.

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

Келесі делдің мысалы.

Қоршаған орта айнымалысы қайтадан қосылады, содан кейін жойылады. Егер орта айнымалысы болмаса, қате (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.unsetenv () арқылы жойылғанда os.environ мәні жаңартылмайды. Сондықтан, os.environ кілтін (ортаның айнымалы атауы) көрсетіп, оны жоғарыдағы мысалда көрсетілгендей жөндеген жөн.

Егер unsetenv () қолдау көрсетілсе, os.environ ішіндегі элементті жою unsetenv () сәйкес қоңырауға автоматты түрде аударылады. Іс жүзінде, os.environ ішіндегі элементтерді жою қолайлы операция болып табылады, өйткені unsetenv () тікелей қоңыраулары os.environ жаңартылмайды.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Қоршаған орта айнымалыларын жою тек Python бағдарламасында ғана тиімді. Ол жүйелік ортаның айнымалыларын жоймайды.

Қоршаған орта айнымалыларының әсері

Мен бірнеше рет жазғанымдай, os.environ ортасының айнымалысын өзгерту (орнату немесе жою) жүйелік орта айнымалысын өзгертпейді, бірақ ол бағдарламада іске қосылатын ішкі процестерге әсер етеді.

Келесі код Windows жүйесінде күтілгендей жұмыс істемейді, себебі LANG ортасының айнымалысы жоқ және күн пәрменінің мазмұны әр түрлі.

Ішкі процесс модулінде күн командасын шақыру.

Date командасының шығыс нәтижесі 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')
# こんにちは

Сонымен қатар, егер қоршаған ортаның айнымалылары даму ортасы мен өндірістік ортаны көрсететін етіп орнатылса, мысалы, сіз осы айнымалылардың мәндерін ала аласыз және процесті ауыстыра аласыз.