Sự khác biệt giữa os.getenv và os.envir.get


159

Có sự khác biệt nào giữa cả hai phương pháp không?

>>> os.getenv('TERM')
'xterm'
>>> os.environ.get('TERM')
'xterm'

>>> os.getenv('FOOBAR', "not found") == "not found"
True
>>> os.environ.get('FOOBAR', "not found") == "not found"
True

Chúng dường như có cùng chức năng.

Câu trả lời:


60

Một sự khác biệt được quan sát (Python27):

os.environđưa ra một ngoại lệ nếu biến môi trường không tồn tại. os.getenvkhông đưa ra một ngoại lệ, nhưng trả về Không


119
OP hỏi về việc os.environ.get()trả về None(trừ khi được chỉ định khác nhau) và không bao giờ đưa ra ngoại lệ nếu env. var. không tồn tại Những điều khó hiểu của bạn với việc sử dụng os.environ['TERM']không phải là những gì câu hỏi là về.
Anthon

2
Câu hỏi của OP hỏi về os.environ.get()vs os.getenv()nhưng cơ thể cũng bao gồm os.environso với os.environ.get()vì vậy câu trả lời này đúng theo ít nhất một số cách - không đầy đủ, nhưng chính xác.
FKEi Internet

3
Câu trả lời sai và không chính xác này đã nhận được phiếu bầu tiêu cực. Câu trả lời tiếp theo là đúng.
RayLuo

80

Xem chủ đề liên quan này . Về cơ bản, os.environđược tìm thấy khi nhập khẩu, và os.getenvlà một trình bao bọc đểos.environ.get , ít nhất là trong CPython.

EDIT: Để trả lời một bình luận, trong CPython, os.getenvvề cơ bản là một lối tắt đến os.environ.get; kể từ khi os.environđược tải khi nhập osvà chỉ sau đó, cùng giữ cho os.getenv.


1
Trên thực tế, đó là, theo doc chính thức: docs.python.org/3/library/os.html
ivanleoncz

1
Từ luồng liên quan được liên kết: "lý do chính để sử dụng os.getenv()[...] là khi bạn muốn trả về giá trị mặc định khi tên biến môi trường không được tìm thấy trong os.environcác khóa thay vì KeyErrorbị ném hoặc bất cứ thứ gì bị ném và bạn muốn lưu một vài ký tự. "
trí

35

Trong Python 2.7 với iPython:

>>> import os
>>> os.getenv??
Signature: os.getenv(key, default=None)
Source:
def getenv(key, default=None):
    """Get an environment variable, return None if it doesn't exist.
    The optional second argument can specify an alternate default."""
    return environ.get(key, default)
File:      ~/venv/lib/python2.7/os.py
Type:      function

Vì vậy, chúng ta có thể kết luận os.getenvchỉ là một gói đơn giản xung quanh os.environ.get.


15

Mặc dù không có sự khác biệt về chức năng giữa os.environ.getos.getenv, có một sự khác biệt lớn giữa os.putenvvà cài đặt các mục trên os.environ. os.putenvđược chia nhỏ , vì vậy bạn nên mặc định os.environ.getđơn giản để tránh đường os.getenvkhuyến khích bạn sử dụngos.putenv cho đối xứng.

os.putenvthay đổi các biến môi trường hệ điều hành cấp thực tế, nhưng theo một cách mà không hiển thị thông qua os.getenv, os.environhoặc bất kỳ cách nào stdlib khác kiểm tra các biến môi trường:

>>> import os
>>> os.environ['asdf'] = 'fdsa'
>>> os.environ['asdf']
'fdsa'
>>> os.putenv('aaaa', 'bbbb')
>>> os.getenv('aaaa')
>>> os.environ.get('aaaa')

Bạn có thể phải thực hiện một cuộc gọi ctypes đến cấp độ C getenvđể xem các biến môi trường thực sau khi gọi os.putenv. (Khởi chạy một quy trình con shell và yêu cầu nó cho các biến môi trường của nó cũng có thể hoạt động, nếu bạn rất cẩn thận về việc thoát và --norc/ --noprofile/ bất cứ điều gì khác bạn cần làm để tránh cấu hình khởi động, nhưng có vẻ khó hơn rất nhiều để làm đúng.)


2

Ngoài các câu trả lời trên:

$ python3 -m timeit -s 'import os' 'os.environ.get("TERM_PROGRAM")'
200000 loops, best of 5: 1.65 usec per loop

$ python3 -m timeit -s 'import os' 'os.getenv("TERM_PROGRAM")'
200000 loops, best of 5: 1.83 usec per loop

Phiên bản Python nào bạn đã thử nghiệm. Vào ngày 3.7.2, os.getenvchỉ là một trình bao bọc cho os.environ.get, vì vậy tôi đang nhận được rất ít chi phí.
Preslav Rachev

Đó là 3.7.1 trên macOS Mojave. Thời gian là khá nhất quán.
fredrik

@PreslavRachev tối thiểu hoặc không phải là một cuộc gọi chức năng bổ sung, vì vậy có một số chi phí. Điều đó đang được nói, có lẽ bạn không cần phải truy xuất các biến env ở giữa vòng lặp bên trong của bạn.
pmav99

7
Hoàn toàn không liên quan. Tối ưu hóa vi mô của một cuộc gọi chức năng duy nhất ... Bất kỳ ứng dụng nào cũng chỉ nên đọc môi trường trên bootstrap, làm cho điều này thậm chí không liên quan hơn.
Victor Schröder

1
BTW, useclà một micro trong timeit. Sự khác biệt được tìm thấy trong điểm chuẩn vi mô này là 0,18 micro giây ...
Victor Schröder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.