¿Cuándo os.environ no coincidirá con os.getenv (‘foo’)?

Tengo una pequeña aplicación de Python, iniciada a través de subprocess.Popen , que toma algunos parámetros en forma de variables de entorno. Lo hago pasando la estructura del entorno a la llamada de Popen . El progtwig luego lee las variables a través de os.getenv .

O más bien, solía leerlos de esa manera. En Windows, funcionó bien. Pero en nuestros servidores de FreeBSD, os.getenv devuelve None para todos los parámetros que pasamos. La parte extraña es que os.environ tiene los valores muy bien, y, de hecho, simplemente cambiando todas las os.getenv('foo') os.environ['foo'] hizo que todo funcionara bien en ambas plataformas.

¿Por qué estos valores son diferentes? ¿Cuándo es apropiado uno sobre el otro?

os.environ se crea en la importación del módulo os , y no refleja los cambios en el entorno que se producen después, a menos que se modifique directamente. Curiosamente, sin embargo, os.getenv() realidad tampoco recibe las variables de entorno más recientes, al menos no en CPython. Verá, en CPython, os.getenv() aparentemente es solo una envoltura alrededor de os.environ.get() (vea http://hg.python.org/cpython/file/6671c5039e15/Lib/os.py#l646 ) . Por lo tanto, parece que la razón principal para usar os.getenv() con la implementación indicada es cuando se desea que se devuelva un valor predeterminado cuando no se encuentra un nombre de variable de entorno en las claves de os.environ en lugar de tener un KeyError o lo que sea Tirado, y desea guardar algunos caracteres.

Es completamente posible que la implementación en FreeBSD tenga algún truco extraño que haga que actúe de manera diferente, pero no estoy seguro de por qué ese sería el caso. Mire la copia de os.py en una de las máquinas de FreeBSD que usa, si puede.