دریافت ، افزودن ، رونویسی و حذف متغیرهای محیط در پایتون (os.environ)

کسب و کار

متغیرهای محیط را می توان بازیابی ، بررسی ، تنظیم (اضافه یا رونویسی) کرد و در برنامه های پایتون با استفاده از os.environ حذف کرد. توجه داشته باشید که تغییرات ایجاد شده یا حذف متغیرهای محیط فقط در برنامه پایتون مثر است. این بدان معنا نیست که متغیرهای محیط سیستم بازنویسی شوند.

اطلاعات زیر در اینجا ارائه شده است.

  • 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)

همانند فرهنگ لغت ، می توانید از روش های زیر استفاده کنید یا از آنها برای بررسی وجود کلیدها و مقادیر استفاده کنید.

  • 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.putenv () تنظیم می کند ، مقدار os.environ به روز نمی شود. به همین دلیل ، ترجیحاً کلید (نام متغیر محیط) os.environ را مشخص کرده و مقدار را همانطور که در مثال بالا نشان داده شده است ، اختصاص دهید.

اگر putenv () پشتیبانی شود ، انتساب به یک مورد در os.environ به طور خودکار به تماس مربوطه به putenv () تبدیل می شود. در عمل ، اختصاص یک مورد در os.environ عملیات ترجیحی است ، زیرا تماس مستقیم با putenv () os.environ را به روز نمی کند.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

همانطور که قبلاً ذکر شد ، تغییرات ایجاد شده با افزودن یا رونویسی متغیرهای محیط فقط در برنامه پایتون مثر است. این بدان معنا نیست که متغیرهای محیط سیستم بازنویسی شوند.

توجه داشته باشید که تغییر مقدار ممکن است بسته به سیستم عامل باعث نشت حافظه شود.

توجه: در برخی سیستم عامل ها ، از جمله 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)

حذف متغیرهای محیط

برای حذف یک متغیر محیطی ، از روش pop () os.environ یا عبارت 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

در زیر نمونه ای از 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.environ هنگامی که توسط os.unsetenv () حذف می شود ، به روز نمی شود. بنابراین ، ترجیحاً کلید (نام متغیر محیط) os.environ را مشخص کرده و همانطور که در مثال بالا نشان داده شده حذف شود.

اگر unsetenv () پشتیبانی شود ، حذف یک مورد در os.environ به طور خودکار به تماس مربوطه به unsetenv () تبدیل می شود. در عمل ، حذف موارد در os.environ عملیات ترجیحی است ، زیرا تماسهای مستقیم با unsetenv () os.environ را به روز نمی کند.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

حذف متغیرهای محیط نیز فقط در آن برنامه پایتون مثر است. متغیرهای محیط سیستم را حذف نمی کند.

تأثیر تغییر متغیرهای محیط

همانطور که بارها و بارها نوشته ام ، تغییر (تنظیم یا حذف) متغیر محیطی os.environ متغیر محیط سیستم را تغییر نمی دهد ، اما بر فرایندهای فرعی که در برنامه اجرا می شوند تأثیر می گذارد.

کد زیر در ویندوز مطابق انتظار کار نخواهد کرد زیرا متغیر محیط LANG وجود ندارد و محتویات دستور date متفاوت است.

فراخوانی دستور date در ماژول فرایند فرعی.

نتیجه خروجی فرمان 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
# 

به منظور توضیح ، ما متغیر محیط LANG را در os.environ تغییر داده ایم ، اما پایتون یک ماژول محلی برای کنترل محلی ارائه می دهد.

تغییر فرایندها بر اساس متغیرهای محیطی

همچنین امکان تغییر فرایند با توجه به مقدار یک متغیر محیط وجود دارد.

در اینجا نمونه ای از تغییر خروجی با توجه به متغیر محیط 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')
# こんにちは

علاوه بر این ، اگر متغیرهای محیطی برای نشان دادن محیط توسعه و محیط تولید تنظیم شده باشند ، به عنوان مثال ، می توانید مقادیر این متغیرها را دریافت کرده و روند را تغییر دهید.

Copied title and URL