รับ เพิ่ม เขียนทับ และลบตัวแปรสภาพแวดล้อมใน Python (os.environ)

ธุรกิจ

ตัวแปรสภาพแวดล้อมสามารถดึง ตรวจสอบ ตั้งค่า (เพิ่มหรือเขียนทับ) และลบในโปรแกรม Python โดยใช้ os.environ โปรดทราบว่าการเปลี่ยนแปลงที่เกิดจากการตั้งค่าหรือการลบตัวแปรสภาพแวดล้อมจะมีผลภายในโปรแกรม Python เท่านั้น ไม่ได้หมายความว่าตัวแปรสภาพแวดล้อมของระบบจะถูกเขียนใหม่

ข้อมูลต่อไปนี้มีให้ที่นี่

  • os.environ
  • รับตัวแปรสภาพแวดล้อม
  • ตั้งค่า (เพิ่ม/เขียนทับ) ตัวแปรสภาพแวดล้อม
  • ลบตัวแปรสภาพแวดล้อม
  • ผลกระทบของการเปลี่ยนแปลงตัวแปรสภาพแวดล้อม
  • การสลับกระบวนการตามตัวแปรสภาพแวดล้อม

นำเข้าและใช้โมดูลระบบปฏิบัติการ เนื่องจากเป็นไลบรารีมาตรฐาน จึงไม่จำเป็นต้องติดตั้งเพิ่มเติม โมดูลกระบวนการย่อยรวมอยู่ในไลบรารีมาตรฐานด้วย

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(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 การเปลี่ยนค่าของ environ อาจทำให้หน่วยความจำรั่วได้
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

ต่อไปนี้เป็นตัวอย่างของเดล

ตัวแปรสภาพแวดล้อมถูกเพิ่มอีกครั้งแล้วลบออก หากไม่มีตัวแปรสภาพแวดล้อม แสดงว่าเกิดข้อผิดพลาด (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 ต่างกัน

การเรียกคำสั่ง 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 แต่ 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')
# こんにちは

นอกจากนี้ หากมีการตั้งค่าตัวแปรสภาพแวดล้อมเพื่อระบุสภาพแวดล้อมการพัฒนาและสภาพแวดล้อมการผลิต ตัวอย่างเช่น คุณสามารถรับค่าของตัวแปรเหล่านี้และเปลี่ยนกระบวนการได้