2011-05-11 16 views
308

Necesito establecer algunas variables de entorno en el script python y quiero que todas las demás secuencias de comandos sean llamadas desde python (scripts de shell) que serán procesos secundarios para ver las variables de entorno establecidas. El valor es un numeroCómo establecer variables de entorno en Python

Si lo 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 del script) una vez que lo configuro. las variables

Respuesta

395

medio ambiente deben ser cadenas, a fin de utilizar

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

para establecer la variable DEBUSSY a la cadena 1. Para acceder a esta variable después, sólo tiene que utilizar

print os.environ["DEBUSSY"] 

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

+7

En algunas plataformas, modificando os.environ realidad no va a modificar el entorno del sistema, ya sea para los procesos actuales de proceso o de niño. Consulte los documentos para obtener más información: https://docs.python.org/2/library/os.html#os.environ – Evan

+2

@Evan Puede haber algunas variantes históricas de Unix que no admiten 'putenv()', pero para esos Unixen no hay nada que puedas hacer de todos modos. Incluso la versión anterior de AIX y HPUX con la que trabajé lo soportaba. Si alguien es capaz de encontrar una computadora que no la soporte hoy, tengo serias dudas de que puedan ejecutar Python en esa computadora. :) –

+0

** Precaución: ** para citar la referencia de @ Evan anterior, * Tales cambios en el entorno afectan a los subprocesos iniciados con os.system(), popen() o fork() y execv(). * En otras palabras, tenga en cuenta que este enfoque no modificará la forma en que se ejecuta su programa, solo la forma en que se ejecutan los hijos de su programa. Es cierto que su programa puede establecer y leer variables de entorno, pero solo desde el entorno que configura para sus hijos. Ver también: [cambiar el entorno de proceso actual] (http://stackoverflow.com/q/1178094/5025060). Hasta el momento, no he encontrado una forma de que un script de Python modifique su env principal. –

11

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

15

si lo hago os.environ [ "DEBUSSY"] = 1, es decir que a reclamación 1 tiene que ser cadena.

Después, realice

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

También quiero saber cómo leer las variables de entorno en Python (en la parte posterior del guión) una vez me puse ella.

Sólo tiene que utilizar os.environ["DEBUSSY"], como en

some_value = os.environ["DEBUSSY"] 
80

Es posible que tenga que considerar algunos aspectos adicionales de la robustez de código;

cuando se está almacenando una variable de valor entero como una variable de entorno, trate

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

a continuación para su recuperación, tenga en cuenta que para evitar errores, usted debe tratar

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

posiblemente sustituto ' -1' para 'no está puesta'

así, poner todo eso 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) 
+3

¿Puede decir cómo se configuraría la variable en una máquina Linux, es el mismo código para todas las plataformas? –

6

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

Ahora, un problema que tuve es que si traté de usar os.system para ejecutar un archivo por lotes que establezca las variables de su entorno (utilizando el comando SET en un archivo ** .bat *), realmente no los establecería para su Entorno Python (pero para el proceso hijo que se crea con la función os.system).Para conseguir realmente las variables establecidas en el entorno de pitón, yo 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 
15

debe asignar valor de cadena a la variable de entorno.

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

Si desea leer o imprimir la variable de entorno sólo tiene que utilizar

print os.environ["DEBUSSY"]

Este cambio será efectivo sólo para el proceso actual en la que se le asignó, lo hará ningún cambio de la valorar permanentemente Los procesos secundarios heredarán automáticamente el entorno del proceso principal.

enter image description here

+1

"Estos cambios serán efectivos solo para el proceso actual donde fue asignado, no cambiará el valor permanentemente. "Esto respondió una pregunta que tenía sobre el alcance de establecer una variable de entorno. – spitfiredd

+0

Si salgo del shell de python, y el entorno de os configurado anteriormente se ha ido. – MeadowMuffins

4

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

>>> import os 
>>> os.environ.has_key('HOME') # Check an existing env. variable 
True 
>>> os.environ.has_key('FOO') # Check 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' 

me había topado con un problema recientemente y descubierto, si tiene otras secuencias de comandos de actualización del entorno mientras su secuencia de comandos python se está ejecutando, llamar os.environ nuevamente no reflejará los últimos valores.

Extracto de la docs:

Esta asignación se capturó la primera vez que el módulo OS es importado, típicamente durante el inicio Python como parte de site.py. procesamiento Los cambios en el entorno realizados después de este tiempo no se reflejan en os.environ, excepto los cambios realizados al modificar 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) 
<type 'dict'> 
3

Cuando juegas con las variables de entorno (añadir/modificar/eliminar variables), un buen la práctica es restaurar el estado anterior al completar la función.

Es posible que necesite algo como el administrador de contexto modified_environ describa en este question para restaurar las variables de entorno.

uso clásico:

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