Solución:
La sustitución de variables ambientales. en la línea de comando lo hace el shell, no / 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é configurada cuando shell=False
, sin embargo. Incluso sin shell=True
, el ejecutable ve las variables de entorno establecidas por el env
parámetro. Por ejemplo, date
se ve afectado por el TZ
Variable ambiental:
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 descompresión, por ejemplo:
env = {
**os.environ,
"TEST_VARIABLE": str(1234),
}
subprocess.Popen('/usr/bin/mybinary', env=env).wait()
Deberías 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.
Vea esta respuesta.