Asignar variables de entorno desde el script bash a la sesión actual desde Python

Tengo muchos scripts de bash para ayudar a configurar mis variables de entorno de sesión actuales. Necesito configurar las variables env para poder usar el módulo de subproceso para ejecutar comandos en mis scripts de Python. Así es como ejecuto los scripts de bash:

. ./file1.sh 

A continuación se muestra el comienzo de la secuencia de comandos bash:

 echo "Setting Environment Variable..." export HORCMINST=99 echo $HORCMINST ... 

¿Hay una manera de llamar a estos scripts de bash desde un script de python o hacer algo similar dentro de un script de python?

Usando shell=True con su script existente

Primero, en términos de lo más simple : si está usando shell=True , puede decirle al shell que comienza a ejecutar el contenido de su script preexistente sin modificar.

Es decir, si inicialmente estuvieras haciendo esto:

 subprocess.Popen(['your-command', 'arg1', 'arg2']) 

… luego puede hacer lo siguiente para ejecutar el mismo comando, con casi las mismas garantías de seguridad (las únicas vulnerabilidades adicionales, siempre que los contenidos de file1.sh sean confiables, son problemas fuera de banda como shellshock ):

 # this has the security of passing explicit out-of-band args # but sources your script before the out-of-process command subprocess.Popen(['. "$1"; shift; exec "$@"', "_", "./file1.sh", "your-command", "arg1", "arg2"], shell=True) 

Uso de /proc/self/environ para exportar variables de entorno en un flujo delimitado por NUL

Lo ideal es exportar las variables de entorno de forma no ambigua (lo ideal es una secuencia delimitada por NUL) y luego analizar esa secuencia (que está en un formato muy inequívoco) en Python.

Suponiendo que Linux, puede exportar el conjunto completo de variables de entorno de la siguiente manera:

 # copy all our environment variables, in a NUL-delimited stream, to myvars.environ cat myvars.environ 

… o puede exportar un conjunto específico de variables a mano:

 for varname in HORCMINST PATH; do printf '%s=%s\0' "$varname" "${!varname}" done >myvars.environ 

Leyendo y analizando un flujo delimitado por NUL en Python

Entonces solo necesitas leerlos y analizarlos:

 #!/usr/bin/env python env = {} for var_def in open('myvars.environ', 'r').read().split('\0'): (key, value) = var_def.split('=', 1) env[key] = value import subprocess subprocess.Popen(['your-command', 'arg1', 'arg2'], env=env) 

También puede aplicar esas variables inmediatamente ejecutando os.environ[key]=value .


Leyendo y analizando un flujo delimitado por NUL en bash

Por cierto, ese mismo formato también es fácil de analizar en bash:

 while IFS= read -r -d '' var_def; do key=${var_def%%=*} value=${var_def#*=} printf -v "$key" '%s' "$value" export "$key" done  

Ahora, ¿por qué un flujo delimitado por NUL? Debido a que las variables de entorno son cadenas C, a diferencia de las cadenas Python, no pueden contener NUL. Como tal, NUL es el único carácter que puede usarse de forma segura para delimitarlos.

Por ejemplo, alguien que intentó usar nuevas líneas podría verse obstaculizado por una variable de entorno que contenía una nueva línea literal; y si alguien está, por ejemplo, incrustando un script corto de Python dentro de una variable de entorno, ¡es un evento muy plausible!

Debes considerar el módulo de Python builtin os . El atributo os.environ es un diccionario de variables de entorno que puede leer , por ejemplo,

 import os os.environ["USER"] 

Sin embargo, no puede escribir variables de entorno bash desde el proceso hijo (consulte, por ejemplo, Cómo utilizar exportar con Python en Linux ).

Ambas preguntas son respondidas antes. Puedes ejecutar scripts de bash desde python con algo como;

 import subprocess subprocess.Popen("cwm --rdf test.rdf --ntriples > test.nt") 

Vea esta pregunta ejecutando comandos bash en python

Configure mejor las variables de entorno directamente en Python, vea esta pregunta Cómo configurar variables de entorno en Python