Establecer la variable de entorno de shell a través de script python

Tengo un instrumento que requiere una variable de entorno que quiero configurar automáticamente desde el código de Python. Así que intenté varias formas de hacerlo, pero ninguna de ellas tuvo éxito. Aquí hay unos ejemplos:

  1. Inserto el siguiente código en mi script de python

    import os os.system("export ENV_VAR=/some_path") 
  2. Creé el script bash (env.sh) y lo ejecuté desde python:

     #!/bin/bash export ENV_VAR=some_path #call it from python os.system("source env.sh") 
  3. También probé os.putenv () y os.environ [“ENV_VAR”] = “some_path”

¿Es posible establecer (exportar) la variable de entorno usando python, es decir, sin exportarlo directamente a shell?

Siempre que inicie el “instrumento” (un script que supuse) desde el mismo proceso debería funcionar:

 In [1]: os.putenv("VARIABLE", "123") In [2]: os.system("echo $VARIABLE") 123 

No puede cambiar una variable de entorno de un proceso diferente o un proceso padre.

Al establecer una variable de entorno, solo se establece para el proceso actual y cualquier proceso secundario que se inicie. Por lo tanto, usar os.system lo configurará solo para el shell que se está ejecutando para ejecutar el comando que proporcionó. Cuando ese comando termina, el shell desaparece, y también lo hace la variable de entorno. Establecerlo utilizando os.putenv o os.environ tiene un efecto similar; las variables de entorno se establecen para el proceso de Python y cualquier elemento secundario del mismo.

Supongo que está intentando configurar esas variables para el shell desde el que ejecuta el script o de forma global. Eso no puede funcionar porque el shell (u otro proceso) no es un elemento secundario del script de Python en el que está configurando la variable.

Tendrás mejor suerte al configurar las variables en un script de shell. Si luego source esa secuencia de comandos (de modo que se ejecute en la instancia actual del shell, en lugar de en una subshell), permanecerán configuradas después de que finalice la secuencia de comandos.

Dependiendo de cómo ejecute su instrumento, es posible que pueda cambiar el entorno específicamente para el proceso hijo sin afectar al padre. Consulte la documentación de os.spawn*e o subprocess.Popen que acepte argumentos separados que denotan entorno secundario. Por ejemplo, Reemplazando la familia os.spawn en la documentación del módulo de subprocess que proporciona ambos usos:

Ejemplo de entorno:

 os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) ==> Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})