Cómo usar exportar con Python en Linux

Necesito hacer una exportación como esta en Python:

# export MY_DATA="my_export" 

He tratado de hacer:

 # -*- python-mode -*- # -*- coding: utf-8 -*- import os os.system('export MY_DATA="my_export"') 

Pero cuando enumero la exportación, no aparece “MY_DATA”:

 # export 

¿Cómo puedo realizar una exportación con Python sin guardar “my_export” en un archivo?

En realidad quieres hacer

 import os os.environ["MY_DATA"] = "my_export" 

export es un comando que le das directamente al shell (por ejemplo, bash ), para decirle que agregue o modifique una de sus variables de entorno. No puede cambiar el entorno de su shell desde un proceso secundario (como Python), simplemente no es posible.

os.system('export MY_DATA="my_export"') es lo que está sucediendo con usted, intente os.system('export MY_DATA="my_export"')

 /bin/bash process, command `python yourscript.py` forks python subprocess |_ /usr/bin/python process, command `os.system()` forks /bin/sh subprocess |_ /bin/sh process, command `export ...` changes local environment 

Cuando el subproceso más abajo /bin/sh termina de ejecutar su comando export ... , se descarta, junto con el entorno que acaba de cambiar.

Otra forma de hacer esto, si tienes prisa y no te importa el regusto, es ejecutar la salida del script de Python en tu entorno de bash e imprimir los comandos para ejecutar la configuración del entorno en python. No es ideal, pero puede hacer el trabajo en caso de apuro. No es muy portátil a través de shells, así que YMMV.

 $(python -c 'print "export MY_DATA=my_export"') 

(También puede encerrar la statement en backticks en algunos shells “)

No es tan simple:

 python -c "import os; os.putenv('MY_DATA','1233')" $ echo $MY_DATA # <- empty 

Pero:

 python -c "import os; os.putenv('MY_DATA','123'); os.system('bash')" $ echo $MY_DATA #<- 123 

Puedes probar os.environ [“MY_DATA”] en su lugar.

Es una especie de pirateo porque no es realmente Python haciendo nada especial aquí, pero si ejecuta el comando de exportación en el mismo sub-shell, probablemente obtendrá el resultado que desea.

 import os cmd = "export MY_DATA='1234'; echo $MY_DATA" # or whatever command os.system(cmd) 

Con la esperanza de proporcionar claridad sobre cinfusion común …

He escrito muchas cadenas de herramientas elfbin de Python <--> bash <--> y la forma correcta de verlas es como esto:

Cada proceso (originador) tiene un estado del entorno heredado de cualquier invocación. Cualquier cambio se mantiene en el proceso. La transferencia de un estado de entorno es una función por sí misma y se ejecuta en dos direcciones, cada una con sus propias advertencias. Lo más común es modificar el entorno antes de ejecutar un subproceso. Para ir al metal, mire el exec () – llame a C. Hay una variante que lleva un puntero a los datos del entorno. Esta es la única transferencia de entorno realmente soportada en sistemas operativos típicos.

Los scripts de shell crearán un estado para pasar cuando se ejecutan hijos cuando realiza una exportación . De lo contrario, solo usa lo que obtuvo en primer lugar.

En todos los demás casos, será un mecanismo genérico utilizado para pasar un conjunto de datos para permitir que el proceso de llamada actualice su entorno en función del resultado de la salida de procesos hijo.

Ex:

 ENVUPDATE = $(CMD_THAT_OUTPUTS_KEYVAL_LISTS) echo $ENVUPDATE > $TMPFILE source $TMPFILE 

Por supuesto, lo mismo se puede hacer utilizando json, xml u otras cosas siempre que tenga las herramientas para interpretar y aplicar.

La necesidad de esto puede ser (50% de probabilidad) una señal de una interpretación errónea de las primitivas básicas y de que necesita una mejor configuración o intercambio de parámetros en su solución …

Oh, en python haría algo como … (necesita mejorar dependiendo de tu situación)

 import re RE_KV=re.compile('([az][\w]*)\s*=\s*(.*)') OUTPUT=RunSomething(...) (Assuming 'k1=v1 k2=v2') for kv in OUTPUT.split(' ') try: k,v=RE_KV.match(kv).groups() os.environ[k]=str(v) except: #The not a property case... pass 

Una solución de línea:

 eval `python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'` echo $python_include_path # prints /home//anaconda3/include/python3.6m" in my case 

Descompostura:

Llamada Python

 python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))' 

Se está lanzando un script en Python que

  1. importa sysconfig
  2. obtiene la ruta de inclusión de python correspondiente a este binario de python (use “which python” para ver cuál se está utilizando)
  3. imprime el script “python_include_path = {0}” con {0} como la ruta desde 2

Llamada de evaluación

 eval `python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'` 

Se está ejecutando en la instancia de bash actual la salida del script de Python. En mi caso, su ejecución:

 python_include_path=/home//anaconda3/include/python3.6m 

En otras palabras, está configurando la variable de entorno “python_include_path” con esa ruta para esta instancia de shell.

Inspirado por: http://blog.tintoy.io/2017/06/exporting-environment-variables-from-python-to-bash/

os.system (‘/home/user1/exportPath.ksh’)

exportPath.ksh:

export PATH=MY_DATA="my_export"