Os.getenv ve os.environ.get arasındaki fark


159

Her iki yaklaşım arasında da bir fark var mı?

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

Aynı işlevselliğe sahip gibi görünüyorlar.

Yanıtlar:


60

Bir fark gözlendi (Python27):

os.environçevresel değişken yoksa bir istisna oluşturur. os.getenvbir istisna oluşturmaz, ancak Yok döndürür


119
OP, (farklı bir şekilde belirtilmedikçe) os.environ.get()hangi geri dönüşleri sorar Noneve env. var. mevcut değil. Kullanmakla kafa karıştırıcı os.environ['TERM']olan şey, sorunun ne olduğu değildir.
Anthon

2
OP soru sorar os.environ.get()vs os.getenv()ama vücut da içerir os.environVS. os.environ.get()böylece en azından bazı yönlerden doğru bu cevap - eksik ama doğru.
FKEinternet

3
Bu yanlış ve yanıltıcı cevap olumsuz olumsuz oylar almış olmalıdır. Bir sonraki cevap doğru cevaptır.
RayLuo

80

Bu konuya bakınız . Temel olarak, os.environiçe üzerinde bulunan ve os.getenvbir sarıcı os.environ.geten az CPython içinde,.

DÜZENLEME: CPython'da bir yoruma yanıt vermek os.getenvtemelde os.environ.get; çünkü os.environithalatta yüklenir osve ancak o zaman aynı şey geçerlidir os.getenv.


1
Gerçekten de, resmi dokümana göre: docs.python.org/3/library/os.html
ivanleoncz

1
Bağlantılı ilgili iş parçacığından: " os.getenv()[...] kullanmanın ana nedeni os.environ, a KeyErrorveya her neyse atılmak yerine anahtarlarında ortam değişkeni adı bulunmadığında varsayılan bir değerin döndürülmesini istemenizdir. birkaç karakter kaydetmek istiyorum. "
düşünce balonu

35

İPython ile Python 2.7'de:

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

Sonuç olarak os.getenv, sadece basit bir sargı olduğu sonucuna varabiliriz os.environ.get.


16

Orada arasında hiçbir işlevsel bir fark olsa da os.environ.getve os.getenvbir orada masif arasındaki fark os.putenvve ayar girişleri os.environ. os.putenvolduğu kırık Eğer varsayılan bu yüzden, os.environ.getsadece yol önlemek için os.getenvkullanmak teşvik os.putenvsimetri için.

os.putenvGerçek OS düzeyinde ortam değişkenleri değiştirir, ancak bir şekilde bu aracılığıyla görünmüyor os.getenv, os.environya da ortam değişkenleri teftiş başka stdlib yol:

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

Aradıktan getenvsonra gerçek ortam değişkenlerini görmek için muhtemelen C seviyesine bir ctypes çağrısı yapmanız gerekir os.putenv. (Bir kabuk alt işleminin başlatılması ve ortam değişkenleri için sorulması da işe yarayabilir, eğer başlangıç ​​yapılandırmasından kaçınmak için kaçmanız ve --norc/ --noprofile/ yapmanız gereken başka bir şey varsa, ancak doğru yapmak çok daha zor görünüyor.)


2

Yukarıdaki cevaplara ek olarak:

$ 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

Hangi Python sürümünü test ettiniz? 3.7.2, os.getenvsadece bir sarıcı os.environ.get, bu yüzden çok az ek yük alıyorum.
Preslav Rachev

MacOS Mojave için bu 3.7.1 idi. Zamanlamalar oldukça tutarlıydı.
fredrik

@PreslavRachev minimal ya da değil ekstra bir işlev çağrısı, bu yüzden bazı yükü vardır. Bununla birlikte, muhtemelen iç döngünüzün ortasında env değişkenlerini almanıza gerek yoktur.
pmav99

7
Tamamen alakasız. Tek işlevli bir çağrının mikro optimizasyonu ... Herhangi bir uygulama ortamı sadece bootstrap üzerinde okumalıdır, bu da bunu daha da önemsiz hale getirir.
Victor Schröder

1
BTW, usecbir olduğunu mikrosaniye içinde timeit. Bu mikro kıyaslamada bulunan fark 0.18 mikrosaniyeydi ...
Victor Schröder
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.