Pregunta

En Linux Cuando invoco a Python desde el shell, replica su entorno e inicia el proceso de Python. Por lo tanto, si hago algo como lo siguiente:

import os
os.environ["FOO"] = "A_Value"

Cuando el proceso de Python regrese, FOO, suponiendo que originalmente no estuviera definido, seguirá sin definirse. ¿Hay alguna forma para que el proceso de Python (o cualquier proceso hijo) modifique el entorno de su proceso padre?

Sé que normalmente resuelves este problema usando algo como

source script_name.sh

Pero esto entra en conflicto con otros requisitos que tengo.

¿Fue útil?

Solución

Ningún proceso puede cambiar su proceso padre (o cualquier otro entorno de proceso existente).

Sin embargo, puede crear un nuevo entorno creando un nuevo shell interactivo con el entorno modificado.

Debe generar una nueva copia del shell que utiliza el entorno actualizado y tiene acceso a los stdin, stdout y stderr existentes, y realiza su baile de reinicialización.

Debe hacer algo como usar el subproceso. Abrir para ejecutar / bin / bash -i .

Entonces el shell original ejecuta Python, que ejecuta un nuevo shell. Sí, tienes muchos procesos en ejecución. No, no está tan mal porque el shell original y Python realmente no están haciendo nada excepto esperar a que el subshell termine para que también puedan salir limpiamente.

Otros consejos

No es posible, para ningún proceso hijo, cambiar el entorno del proceso padre. Lo mejor que puede hacer es generar sentencias de shell en stdout que luego obtenga o escribir en un archivo que obtenga en el elemento primario.

Usaría la declaración bash eval y la secuencia de comandos de Python generaría el código de shell

child.py:

#!/usr/bin/env python
print 'FOO="A_Value"'

parent.sh

#!/bin/bash
eval `./child.py`
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top