Lấy, thêm, ghi đè và xóa các biến môi trường trong Python (os.environ)

Kinh doanh

Các biến môi trường có thể được truy xuất, kiểm tra, đặt (thêm hoặc ghi đè) và xóa trong các chương trình Python bằng cách sử dụng os.environ. Lưu ý rằng các thay đổi được thực hiện bằng cách đặt hoặc xóa các biến môi trường chỉ có hiệu lực trong chương trình Python. Nó không có nghĩa là các biến môi trường hệ thống sẽ được viết lại.

Thông tin sau được cung cấp ở đây.

  • os.environ
  • Nhận các biến môi trường.
  • Đặt (thêm / ghi đè) các biến môi trường
  • Xóa các biến môi trường
  • Ảnh hưởng của việc thay đổi các biến môi trường
  • Chuyển đổi các quy trình theo các biến môi trường

Nhập và sử dụng mô-đun hệ điều hành. Vì nó là một thư viện tiêu chuẩn, không cần cài đặt thêm. Mô-đun quy trình con cũng được bao gồm trong thư viện chuẩn.

import os
import subprocess

os.environ

Loại hệ điều hành là os._En Trường.

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

os._Environ là một đối tượng kiểu bản đồ có một cặp khóa và giá trị, đồng thời có các phương thức giống như một từ điển (kiểu dict). Tên biến môi trường là khóa và giá trị của nó là giá trị.

Nội dung của hệ điều hành sẽ được tải khi mô-đun hệ điều hành được nhập. Nội dung của os.environ sẽ không được cập nhật ngay cả khi các biến môi trường hệ thống được thay đổi bằng cách khác trong khi chương trình đang chạy.

Danh sách được hiển thị với print ().

# print(os.environ)

Như với từ điển, bạn có thể sử dụng các phương pháp sau hoặc sử dụng trong để kiểm tra sự tồn tại của các khóa và giá trị.

  • keys()
  • values()

Việc xử lý các khóa và giá trị về cơ bản giống như đối với từ điển. Ví dụ được đưa ra dưới đây.

Nhận các biến môi trường.

os.environ[Environment variable name]
Điều này sẽ cho phép bạn lấy giá trị của biến môi trường, nhưng nếu bạn chỉ định tên biến môi trường không tồn tại, bạn sẽ gặp lỗi (KeyError).

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

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

Phương thức get () của os.enosystem có thể được sử dụng để lấy giá trị mặc định nếu nó không tồn tại. Điều này cũng giống như từ điển.

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

print(os.environ.get('NEW_KEY'))
# None

print(os.environ.get('NEW_KEY', 'default'))
# default

Hàm os.getenv () cũng được cung cấp. Giống như phương thức get () của từ điển, nó trả về giá trị mặc định nếu khóa không tồn tại. Hàm này rất hữu ích nếu bạn chỉ muốn lấy và kiểm tra giá trị của một biến môi trường.

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

Đặt (thêm / ghi đè) các biến môi trường

os.environ[Environment variable name]
Bằng cách gán một giá trị cho giá trị này, bạn có thể đặt một biến môi trường.

Khi tên biến môi trường mới được chỉ định, biến môi trường mới được thêm vào và khi tên biến môi trường hiện có được chỉ định, giá trị của biến môi trường sẽ bị ghi đè.

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

Lưu ý rằng việc gán bất kỳ thứ gì khác ngoài một chuỗi sẽ dẫn đến lỗi (TypeError). Nếu bạn muốn gán một giá trị số, hãy chỉ định nó dưới dạng một chuỗi.

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

Hàm os.putenv () cũng được cung cấp. Tuy nhiên, giá trị của os.environ không được cập nhật khi nó được đặt bởi os.putenv (). Vì lý do này, bạn nên chỉ định khóa (tên biến môi trường) của os.environ và gán giá trị như trong ví dụ trên.

Nếu putenv () được hỗ trợ, một nhiệm vụ cho một mục trong os.environ sẽ tự động được chuyển đổi thành một lệnh gọi tương ứng tới putenv (). Trên thực tế, việc gán cho một mục trong os.environ là thao tác ưu tiên, vì một lệnh gọi trực tiếp đến putenv () sẽ không cập nhật os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Như đã đề cập trước đó, các thay đổi được thực hiện bằng cách thêm hoặc ghi đè các biến môi trường chỉ có hiệu lực trong chương trình Python. Nó không có nghĩa là các biến môi trường hệ thống sẽ được viết lại.

Lưu ý rằng việc thay đổi giá trị có thể gây ra rò rỉ bộ nhớ tùy thuộc vào hệ điều hành.

Lưu ý: Trên một số nền tảng, bao gồm FreeBSD và Mac OS X, việc thay đổi giá trị của môi trường có thể gây rò rỉ bộ nhớ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Điều này là do đặc điểm kỹ thuật putenv () của chính hệ điều hành.

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)

Xóa các biến môi trường

Để xóa một biến môi trường, hãy sử dụng phương thức pop () của os.environ hoặc câu lệnh del. Giống như từ điển.

Sau đây là một ví dụ về pop ().

pop () trả về giá trị của biến môi trường đã bị xóa. Theo mặc định, việc chỉ định một biến môi trường không tồn tại sẽ dẫn đến lỗi (KeyError), nhưng việc chỉ định đối số thứ hai sẽ trả về giá trị của biến môi trường nếu nó không tồn tại.

print(os.environ.pop('NEW_KEY'))
# 100

# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'

print(os.environ.pop('NEW_KEY', None))
# None

Sau đây là một ví dụ về del.

Biến môi trường được thêm lần nữa, và sau đó bị xóa. Nếu biến môi trường không tồn tại, một lỗi (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'

Hàm os.unsetenv () cũng được cung cấp. Tuy nhiên, như với os.putenv (), giá trị của os.environ không được cập nhật khi nó bị xóa bởi os.unsetenv (). Do đó, tốt hơn là chỉ định khóa (tên biến môi trường) của os.enosystem và xóa nó như được hiển thị trong ví dụ trên.

Nếu unsetenv () được hỗ trợ, việc xóa một mục trong os.environ sẽ tự động dịch sang lệnh gọi tương ứng thành unsetenv (). Trên thực tế, việc xóa các mục trong os.environ là thao tác được ưu tiên, vì các lệnh gọi trực tiếp tới unsetenv () sẽ không cập nhật os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Việc xóa các biến môi trường cũng chỉ có hiệu lực trong chương trình Python đó. Nó không loại bỏ các biến môi trường hệ thống.

Ảnh hưởng của việc thay đổi các biến môi trường

Như tôi đã viết nhiều lần, việc thay đổi (thiết lập hoặc xóa) biến môi trường os.environ không thay đổi biến môi trường hệ thống, nhưng nó ảnh hưởng đến các quy trình con được khởi chạy trong chương trình.

Đoạn mã sau sẽ không hoạt động như mong đợi trên Windows vì không có biến môi trường LANG và nội dung của lệnh ngày là khác nhau.

Gọi lệnh date trong mô-đun quy trình con.

Kết quả đầu ra của lệnh ngày thay đổi tùy thuộc vào giá trị của biến môi trường 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
# 

Để giải thích, chúng tôi đã thay đổi biến môi trường LANG trong os.enosystem, nhưng Python cung cấp một mô-đun ngôn ngữ để kiểm soát ngôn ngữ.

Chuyển đổi các quy trình theo các biến môi trường

Cũng có thể chuyển đổi quy trình theo giá trị của một biến môi trường.

Đây là một ví dụ về việc thay đổi đầu ra theo biến môi trường LANG trong cài đặt ngôn ngữ. Ở đây chúng tôi đang sử dụng phương thức startwith () để xác định xem chuỗi có bắt đầu bằng chuỗi được chỉ định hay không, nhưng nếu bạn muốn xác định kết quả khớp chính xác, bạn có thể sử dụng “==” để so sánh.

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

Ngoài ra, nếu các biến môi trường được đặt để chỉ ra môi trường phát triển và môi trường sản xuất, chẳng hạn, bạn có thể lấy giá trị của các biến này và chuyển đổi quy trình.

Copied title and URL