يمكن استرداد متغيرات البيئة والتحقق منها وضبطها (إضافتها أو الكتابة فوقها) وحذفها في برامج Python باستخدام os.environ. لاحظ أن التغييرات التي يتم إجراؤها عن طريق تعيين متغيرات البيئة أو حذفها تكون فعالة فقط داخل برنامج Python. هذا لا يعني أنه سيتم إعادة كتابة متغيرات بيئة النظام.
يتم توفير المعلومات التالية هنا.
os.environ
- احصل على متغيرات البيئة.
- قم بتعيين (إضافة / كتابة) متغيرات البيئة
- إزالة متغيرات البيئة
- تأثير متغيرات البيئة المتغيرة
- تبديل العمليات حسب متغيرات البيئة
استيراد واستخدام وحدة نظام التشغيل. نظرًا لأنها مكتبة قياسية ، فلا يلزم إجراء تثبيت إضافي. يتم تضمين وحدة العملية الفرعية أيضًا في المكتبة القياسية.
import os
import subprocess
os.environ
نوع بيئة التشغيل هو os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ عبارة عن كائن من نوع الخريطة له زوج من المفاتيح والقيمة ، وله نفس طرق القاموس (نوع الدكت). اسم متغير البيئة هو مفتاح ، وقيمته هي القيمة.
سيتم تحميل محتويات 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'
يمكن استخدام طريقة 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)
إزالة متغيرات البيئة
لحذف متغير بيئة ، استخدم طريقة 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
يعد حذف متغيرات البيئة فعالًا أيضًا ضمن برنامج 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
#
من أجل التوضيح ، قمنا بتغيير متغير بيئة 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')
# こんにちは
بالإضافة إلى ذلك ، إذا تم تعيين متغيرات البيئة للإشارة إلى بيئة التطوير وبيئة الإنتاج ، على سبيل المثال ، يمكنك الحصول على قيم هذه المتغيرات وتبديل العملية.