Cómo establecer variables de entorno en Python

Necesito establecer algunas variables de entorno en el script de python y quiero que todos los demás scripts que se llaman desde python (shell scripts), que serán procesos secundarios, vean el conjunto de variables del entorno. El valor es un número.

Si hago os.environ["DEBUSSY"] = 1 , se queja diciendo que 1 tiene que ser una cadena. También quiero saber cómo leer las variables de entorno en python (en la parte posterior de la secuencia de comandos) una vez que lo establezca.

Las variables de entorno deben ser cadenas, así que use

 os.environ["DEBUSSY"] = "1" 

para establecer la variable DEBUSSY a la cadena 1 . Para acceder a esta variable más adelante, simplemente use

 print os.environ["DEBUSSY"] 

Los procesos secundarios heredan automáticamente el entorno del proceso principal, no se requiere ninguna acción especial de su parte.

Es posible que deba considerar algunos aspectos adicionales para la robustez del código;

cuando almacena una variable de valor entero como una variable de entorno, intente

 os.environ['DEBUSSY'] = str(myintvariable) 

luego para la recuperación, considere que para evitar errores, debe intentar

 os.environ.get('DEBUSSY', 'Not Set') 

posiblemente sustituir ‘-1’ por ‘No establecido’

Entonces, para poner todo junto

 myintvariable = 1 os.environ['DEBUSSY'] = str(myintvariable) strauss = int(os.environ.get('STRAUSS', '-1')) # NB KeyError <=> strauss = os.environ['STRAUSS'] debussy = int(os.environ.get('DEBUSSY', '-1')) print "%s %u, %s %u" % ('Strauss', strauss, 'Debussy', debussy) 

os.environ comporta como un diccionario de Python, por lo que se pueden realizar todas las operaciones comunes del diccionario. Además de las operaciones de get y set mencionadas en las otras respuestas, también podemos verificar si existe una clave

Python 2

 >>> import os >>> os.environ.has_key('HOME') # Check an existing env. variable True >>> os.environ.has_key('FOO') # Check for a non existing variable False >>> os.environ['FOO'] = '1' # Set a new env. variable (String value) >>> os.environ.has_key('FOO') True >>> os.environ.get('FOO') # Retrieve the value '1' 

Python 3

Para Python 3, los diccionarios usan la palabra clave in en lugar de has_key

 >>> import os >>> 'HOME' in os.environ # Check an existing env. variable True ... 

Hay una cosa importante a tener en cuenta sobre el uso de os.environ :

Aunque los procesos secundarios heredan el entorno del proceso principal, recientemente tuve un problema y descubrí que si tiene otros scripts que actualizan el entorno mientras se ejecuta el script de Python, os.environ llamar a os.environ no reflejará los últimos valores .

Extracto de la documentación :

Esta asignación se captura la primera vez que se importa el módulo del sistema operativo, normalmente durante el inicio de Python como parte del proceso site.py. Los cambios en el entorno realizados después de este tiempo no se reflejan en os.environ, a excepción de los cambios realizados modificando os.environ directamente.

os.environ.data que almacena todas las variables de entorno, es un objeto dict, que contiene todos los valores de entorno:

 >>> type(os.environ.data) # changed to _data since v3.2 (refer comment below)  

si hago os.environ [“DEBUSSY”] = 1, se queja diciendo que 1 tiene que ser una cadena.

Entonces hazlo

 os.environ["DEBUSSY"] = "1" 

También quiero saber cómo leer las variables de entorno en python (en la parte posterior de la secuencia de comandos) una vez que lo establezca.

Simplemente use os.environ["DEBUSSY"] , como en

 some_value = os.environ["DEBUSSY"] 

Debe asignar un valor de cadena a la variable de entorno.

os.environ["DEBUSSY"] = "1"

Si desea leer o imprimir la variable de entorno solo use

print os.environ["DEBUSSY"]

Estos cambios serán efectivos solo para el proceso actual donde se asignó, no cambiará el valor permanentemente. Los procesos secundarios heredarán automáticamente el entorno del proceso padre.

introduzca la descripción de la imagen aquí

¿Qué pasa con os.environ["DEBUSSY"] = '1' ? Las variables de entorno son siempre cadenas.

Puede usar el diccionario os.environ para acceder a sus variables de entorno.

Ahora, un problema que tuve es que si intentaba usar os.system para ejecutar un archivo por lotes que establece sus variables de entorno (usando el comando SET en un archivo **. Bat *) realmente no las establecería para su entorno de Python (pero para el proceso hijo que se crea con la función os.system ). Para obtener realmente las variables establecidas en el entorno de Python, utilizo este script:

 import re import system import os def setEnvBat(batFilePath, verbose = False): SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE) SetEnvFile = open(batFilePath, "r") SetEnvText = SetEnvFile.read() SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText) for SetEnvMatch in SetEnvMatchList: VarName=SetEnvMatch[0] VarValue=SetEnvMatch[1] if verbose: print "%s=%s"%(VarName,VarValue) os.environ[VarName]=VarValue 

Cuando juegas con variables de entorno (agregar / modificar / eliminar variables), una buena práctica es restaurar el estado anterior al finalizar la función.

Es posible que necesite algo como el administrador de contexto modified_environ descrito en esta pregunta para restaurar las variables de entorno.

Uso clásico:

 with modified_environ(DEBUSSY="1"): call_my_function() 

para establecer la variable:

Elemento de asignación de método utilizando la clave:

 import os os.environ['DEBUSSY'] = '1' #Environ Variable must be string not Int 

para obtener o para comprobar si existe o no,

Ya que os.environ es una instancia, puedes probar el modo objeto.

Método 1:

 os.environ.get('DEBUSSY') # this is error free method if not will return None by default 

obtendrá '1' como valor de retorno

Método 2:

 os.environ['DEBUSSY'] # will throw an key error if not found! 

Método 3:

 'DEBUSSY' in os.environ # will return Boolean True/False 

Método 4:

 os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements