পাইথনে পরিবেশের ভেরিয়েবল পাওয়া, যোগ করা, ওভাররাইট করা এবং মুছে ফেলা (os.environ)

ব্যবসায়

পরিবেশ ভেরিয়েবলগুলি os.environ ব্যবহার করে পাইথন প্রোগ্রামে পুনরুদ্ধার, চেক, সেট (যোগ বা ওভাররাইট) এবং মুছে ফেলা যেতে পারে। লক্ষ্য করুন যে পরিবেশের ভেরিয়েবলগুলি সেট বা মুছে ফেলার মাধ্যমে পরিবর্তনগুলি কেবল পাইথন প্রোগ্রামের মধ্যে কার্যকর। এর মানে এই নয় যে সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল আবার লেখা হবে।

নিম্নলিখিত তথ্য এখানে প্রদান করা হয়।

  • os.environ
  • পরিবেশের ভেরিয়েবল পান।
  • পরিবেশ ভেরিয়েবল সেট (যোগ/ওভাররাইট) করুন
  • পরিবেশগত পরিবর্তনগুলি সরান
  • পরিবেশগত পরিবর্তনশীলতার প্রভাব
  • পরিবেশগত ভেরিয়েবল দ্বারা প্রক্রিয়াগুলি স্যুইচ করা

ওএস মডিউল আমদানি করুন এবং ব্যবহার করুন। যেহেতু এটি একটি স্ট্যান্ডার্ড লাইব্রেরি, তাই অতিরিক্ত ইনস্টলেশনের প্রয়োজন নেই। সাবপ্রসেস মডিউলটি স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত।

import os
import subprocess

পরিবেশ

Os.environ এর ধরন os._Environ।

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

os। পরিবেশ পরিবর্তনশীল নাম কী, এবং এর মান হল মান।

Os.environ এর বিষয়বস্তু লোড করা হবে যখন ওএস মডিউল আমদানি করা হবে। প্রোগ্রাম চলাকালীন সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল অন্য উপায়ে পরিবর্তিত হলেও os.environ এর বিষয়বস্তু আপডেট হবে না।

তালিকাটি মুদ্রণ () সহ প্রদর্শিত হয়।

# 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'

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 () -এ একটি সংশ্লিষ্ট কলে রূপান্তরিত হবে। অনুশীলনে, os.environ এ একটি আইটেম বরাদ্দ করা পছন্দসই অপারেশন, যেহেতু putenv () এ সরাসরি কল os.environ আপডেট করবে না।
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

আগেই উল্লেখ করা হয়েছে, পরিবেশের ভেরিয়েবল যোগ বা ওভাররাইট করে পরিবর্তনগুলি কেবল পাইথন প্রোগ্রামের মধ্যে কার্যকর। এর মানে এই নয় যে সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল আবার লেখা হবে।

লক্ষ্য করুন যে মান পরিবর্তন করা OS এর উপর নির্ভর করে একটি মেমরি লিক হতে পারে।

দ্রষ্টব্য: ফ্রিবিএসডি এবং ম্যাক ওএস এক্স সহ কিছু প্ল্যাটফর্মে, পরিবেশের মান পরিবর্তন করলে মেমরি লিক হতে পারে।
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 () মুছে ফেলা পরিবেশ ভেরিয়েবলের মান প্রদান করে। ডিফল্টরূপে, একটি পরিবেশগত পরিবর্তনশীল যা নির্দিষ্ট নেই তার একটি ত্রুটি (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.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 এনভায়রনমেন্ট ভেরিয়েবল নেই এবং তারিখ কমান্ডের বিষয়বস্তু আলাদা।

সাবপ্রসেস মডিউলে তারিখ কমান্ড কল করা।

তারিখ কমান্ডের আউটপুট ফলাফল 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 এনভায়রনমেন্ট ভেরিয়েবল পরিবর্তন করেছি, কিন্তু পাইথন লোকেল নিয়ন্ত্রণ করার জন্য একটি লোকেল মডিউল প্রদান করে।

পরিবেশগত ভেরিয়েবল দ্বারা প্রক্রিয়াগুলি স্যুইচ করা

এনভায়রনমেন্ট ভেরিয়েবলের মান অনুযায়ী প্রক্রিয়াটি পরিবর্তন করাও সম্ভব।

ভাষা সেটিংসে LANG এনভায়রনমেন্ট ভেরিয়েবল অনুযায়ী আউটপুট পরিবর্তনের একটি উদাহরণ এখানে দেওয়া হল। নির্দিষ্ট স্ট্রিং দিয়ে স্ট্রিং শুরু হয় কিনা তা নির্ধারণ করার জন্য এখানে আমরা startswith () পদ্ধতি ব্যবহার করছি, কিন্তু যদি আপনি সঠিক মিল নির্ধারণ করতে চান, তাহলে আপনি তুলনা করতে “==” ব্যবহার করতে পারেন।

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

উপরন্তু, যদি পরিবেশ ভেরিয়েবলগুলি ডেভেলপমেন্ট এনভায়রনমেন্ট এবং প্রোডাকশন এনভায়রনমেন্ট নির্দেশ করে, উদাহরণস্বরূপ, আপনি এই ভেরিয়েবলের মান পেতে পারেন এবং প্রক্রিয়াটি পরিবর্তন করতে পারেন।