not - python variables windows
Cómo establecer variables de entorno en Python (8)
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.
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"]
¿Qué pasa con os.environ["DEBUSSY"] = ''1''
? Las variables de entorno son siempre cadenas.
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 question para restaurar las variables de entorno.
Uso clásico:
with modified_environ(DEBUSSY="1"):
call_my_function()
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.
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)
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.
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, uso 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
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 su script de Python, os.environ
llamar a os.environ
no reflejará los valores más recientes .
Extracto de la docs.python.org/2/library/os.html#os.environ :
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)
<type ''dict''>