Python: Exportando variables de entorno en subproceso. Abrir (..)

Estoy teniendo un problema con la configuración de una variable de entorno en una llamada a subprocess.Popen . La variable de entorno no parece estar configurada. ¿Alguna sugerencia sobre cómo configurar correctamente las variables de entorno para una llamada de la línea de comandos de Python?

Mi objective es ejecutar un script que use una variable de entorno determinada a partir de mi código Python:

 d = dict(os.environ) d["TEST_VARIABLE"] = str(1234) subprocess.Popen('/usr/bin/mybinary', env=d).wait() 

pero el script reactjs como si la variable nunca se hubiera establecido

Aquí está mi bash de probar, utilizando el intérprete interactivo de Python:

 d = dict(os.environ) d["TEST_VARIABLE"] = str(1234) subprocess.Popen(['/bin/echo', '$TEST_VARIABLE'], env=d).wait() 

y la salida es:

 "$TEST_VARIABLE" 0 

Pensé que env=d debería establecer el entorno para el subproceso, pero aparentemente no lo hace. ¿Alguna sugerencia sobre cómo corregir este problema?

La sustitución de las variables de entorno en la línea de comando se realiza por el shell, no por / bin / echo. Por lo tanto, debe ejecutar el comando en un shell para obtener la sustitución:

 In [22]: subprocess.Popen('/bin/echo $TEST_VARIABLE', shell=True, env=d).wait() 1234 Out[22]: 0 

Eso no significa que la variable de entorno no esté establecida cuando shell=False , sin embargo. Incluso sin shell=True , el ejecutable ve las variables de entorno establecidas por el parámetro env . Por ejemplo, la date se ve afectada por la variable de entorno TZ :

 In [23]: subprocess.Popen(["date"], env={'TZ': 'America/New_York'}).wait() Wed Oct 29 22:05:52 EDT 2014 Out[23]: 0 In [24]: subprocess.Popen(["date"], env={'TZ': 'Asia/Taipei'}).wait() Thu Oct 30 10:06:05 CST 2014 Out[24]: 0 

Para Python 3.5 y versiones posteriores, puede usar generalizaciones de desempaquetado , por ejemplo:

 env = { **os.environ, "TEST_VARIABLE": str(1234), } subprocess.Popen('/usr/bin/mybinary', env=env).wait() 

Debes usar os.environ.copy() para que funcione. Crea una copia de todo el diccionario de entorno que luego puede modificar antes de pasarlo al subproceso, sin modificar el entorno de proceso actual.

Ver esta respuesta