¿Cómo puedo hacer que los cambios de las variables de entorno se peguen en Python?

Por lo que he leído, cualquier cambio en las variables de entorno en una instancia de Python solo está disponible dentro de esa instancia y desaparece una vez que se cierra la instancia. ¿Hay alguna manera de hacer que se adhieran comprometiéndolos al sistema?

La razón por la que necesito hacer esto es porque en el estudio donde trabajo, herramientas como Maya dependen en gran medida de las variables de entorno para configurar rutas a través de múltiples plataformas.

Mi código de prueba es

import os os.environ['FAKE'] = 'C:\\' 

Al abrir otra instancia de Python y solicitar os.environ['FAKE'] obtiene un KeyError .

NOTA: La portabilidad será un problema, pero la pequeña API que estoy escribiendo podrá verificar la versión del sistema operativo y activar comandos diferentes si es necesario.

Dicho esto, he seguido el camino de usar la técnica de registro de Windows y simplemente escribiré métodos alternativos que llamarán shell scripts en otras plataformas a medida que se conviertan en requisitos.

Bajo Windows es posible que realice cambios en las variables de entorno persistentes a través del registro con esta receta , aunque parezca una exageración.

Para hacerme eco de la pregunta de Brian, ¿qué estás tratando de lograr? Probablemente hay una forma más fácil.

¿Hacer que se adhieran comprometiéndolos al sistema?

Creo que estás un poco confundido aquí. No hay un entorno de ‘sistema’. Cada proceso tiene su propio entorno como parte de su memoria. Un proceso solo puede cambiar su propio entorno. Un proceso puede establecer el entorno inicial para los procesos que crea.

Si realmente cree que necesita establecer variables de entorno para el sistema, tendrá que buscar cambiarlas en la ubicación en la que se cargan inicialmente, como el registro en Windows o su archivo de configuración de shell en Linux.

Puede utilizar SETX en la línea de comandos.

Por defecto, estas acciones van en la vAR USUARIO. Para configurar y modificar las vars del SISTEMA use la marca / M

 import os env_var = "BUILD_NUMBER" env_val = "3.1.3.3.7" os.system("SETX {0} {1} /M".format(env_var,env_val)) 

No creo que puedas hacer esto; Hay dos soluciones que se me ocurren.

  1. La función os.putenv establece el entorno para los procesos con los que comienza, es decir, os.system, popen, etc. Dependiendo de lo que esté tratando de hacer, tal vez podría tener una instancia maestra de Python que establezca la variable y luego genere una nueva instancias.

  2. Podría ejecutar un script de shell o un archivo por lotes para configurarlo, pero eso se vuelve mucho menos portátil. Ver este artículo:

http://code.activestate.com/recipes/159462/

De acuerdo con esta discusión , no puedes hacerlo. ¿Qué está tratando de lograr?

Piensa en ello de esta manera.

No estás configurando variables de entorno de shell.

Estás generando una subshell con algunas configuraciones de variables de entorno determinadas; esta subshell ejecuta su aplicación con el entorno modificado.

Está iniciando un nuevo proceso y no puede cambiar el entorno del proceso principal como no puede hacerlo si inicia un nuevo proceso de shell desde el shell

Es posible que desee probar Python Win32 Extensions , desarrollado por Mark Hammond, que se incluye en ActivePython (o se puede instalar por separado). Puede aprender cómo realizar muchas tareas relacionadas con Windows en el libro de Hammond y Robinson .

Al usar PyWin32 para acceder a los objetos COM de Windows, un progtwig de Python puede usar la Propiedad del entorno (una colección de variables de entorno) del objeto WScript.Shell .

Parece que hay una solución más simple para Windows

 import subprocess subprocess.call(['setx', 'Hello', 'World!'], shell=True) 

Desde dentro de Python? No, no se puede hacer!

Si no está vinculado a Python, debe considerar el uso de scripts de shell (sh, bash, etc.). El comando “fuente” le permite ejecutar una secuencia de comandos que modifica el entorno y se “pegará” como usted quiere a la shell en la que se originó la secuencia de comandos. Lo que está sucediendo aquí es que la shell ejecuta la secuencia de comandos directamente en lugar de crear una sub -proceso para ejecutar el script.

Esto será bastante portátil: puedes usar cygwin en Windows para hacer esto.

En caso de que alguien pueda necesitar esta información. Me doy cuenta de que esto fue pedido hace 7 años, pero incluso me olvido de cómo a veces. .

Sí, hay una manera de hacer que se “peguen” en las ventanas. Simplemente vaya al panel de control, sistema, configuración avanzada del sistema, cuando se abra la ventana de propiedades del sistema, debería ver una opción (botón) para Variables de entorno. .El proceso para llegar a esto es un poco diferente según el sistema operativo que estés usando (google).

Elija eso (haga clic en el botón), luego se abrirá la ventana Variables de entorno. Tiene 2 ventanas divididas, la superior debe ser su “Variables de usuario para su nombre de usuario”. . Seleccione “nuevo”, luego simplemente configure la variable. Por ejemplo, uno de los míos es “Database_Password = mypassword”.

Luego, en su aplicación, puede acceder a ellos de esta forma: import os, os.environ.get (‘Database_Password’). Puedes hacer algo como pass = os.environ.get('Database_Password') .