establecer variables de entorno por archivo usando Python

Tengo un archivo que contiene un conjunto de variables de entorno.

env_script.env:

export a=hjk export b=jkjk export c=kjjhh export i=jkkl .......... 

Quiero establecer estas variables de entorno mediante la lectura del archivo. como puedo hacer esto en python

Código de ejemplo probado:

 pipe = subprocess.Popen([".%s;env", "/home/user/env_script.env"], stdout=subprocess.PIPE, shell=True) output = pipe.communicate()[0] env = dict((line.split("=", 1) for line in output.splitlines())) os.environ.update(env) 

Por favor da alguna sugerencia

No es necesario utilizar subproceso.

Lea las líneas y divida el nombre de la variable de entorno, el valor y asígnele a os.environ :

 import os with open('/home/user/env_script.env') as f: for line in f: if 'export' not in line: continue if line.startswith('#'): continue # Remove leading `export ` # then, split name / value pair key, value = line.replace('export ', '', 1).strip().split('=', 1) os.environ[key] = value 

o usando dict.update y la expresión del generador :

 with open('env_script.env') as f: os.environ.update( line.replace('export ', '', 1).strip().split('=', 1) for line in f if 'export' in line ) 

Alternativamente, puede crear un script de shell de envoltorio, cuya source es env_script.env , y luego ejecutar el archivo de Python original.

 #!/bin/bash source /home/user/env_script.env python /path/to/original_script.py 

Los sistemas operativos modernos no permiten que un proceso secundario cambie el entorno de su padre. El entorno solo se puede cambiar para el proceso actual y sus descendientes. Y un intérprete de Python es un hijo del shell que llama.

Esa es la razón por la que source no es un comando externo, sino que es interpretado directamente por el shell para permitir un cambio en su entorno.

Solía ​​ser posible en el buen viejo sistema MS / DOS con el formato ejecutable .COM. ¡Un archivo ejecutable .com tenía un preámbulo de 256 (0x100) bytes entre los cuales se encontraba un puntero a la cadena de entorno de COMMAND.COM! Entonces, con las funciones de memoria de bajo nivel, y después de asegurarse de no sobrescribir nada más allá del entorno, un comando podría cambiar directamente su entorno principal.

Todavía puede ser posible en el sistema operativo moderno, pero requiere la cooperación del sistema. Por ejemplo, Windows puede permitir que un proceso obtenga acceso de lectura / escritura a la memoria de otro proceso, siempre que se establezcan los permisos adecuados. Pero esta es realmente una forma de pirateo, y no me atrevería a hacer esto en Python.

TL / DR: si su requisito es cambiar el entorno del shell de llamada desde un script de Python, ha entendido mal su requisito.


Pero lo que es fácil es iniciar un nuevo shell con un entorno modificado:

 import os import subprocess env = os.environ.copy() # get a copy of current environment # modify the copy of environment at will using for example falsetru's answer # here is just an example env['AAA'] = 'BBB' # and open a subshell with the modified environment p = subprocess.Popen("/bin/sh", env = env) p.wait()