2008-11-04 19 views
15

En Linux Cuando invoco python desde el shell, replica su entorno e inicia el proceso de python. Por lo tanto, si hago algo como lo siguiente:¿Es posible cambiar el entorno de un proceso principal en python?

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

cuando el proceso vuelve pitón, FOO, suponiendo que no estaba definido originalmente, todavía será indefinido. ¿Hay alguna manera para que el proceso de Python (o cualquier proceso secundario) modifique el entorno de su proceso principal?

Sé que suelen resolver este problema usando algo como

source script_name.sh 

Pero esto entra en conflicto con otros requisitos tengo.

+0

Ver esta pregunta relacionada: http://stackoverflow.com/questions/205064/is-there-a-way-to-change-another-processs-environment-variables – Davide

+0

Andrew de ese hilo respondió: Via gdb: (BGF) adjuntar id_proceso putenv (BGF) llamada ("env_var_name = env_var_value") (BGF) separar Este es un truco desagradable y sólo debe hacerse en el contexto de un escenario de depuración, por supuesto . – grieve

Respuesta

14

Ningún proceso puede cambiar su proceso principal (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 archivos stdin, stdout y stderr existentes, y realiza su danza de reinicialización.

Tiene que hacer algo como usar el subproceso.Popen para ejecutar /bin/bash -i.

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

+0

Sí, esto es lo que estoy haciendo actualmente. Estaba tratando de evitar ese baile de reinicialización. – grieve

+0

Edité tu publicación arreglando algunos errores menores y agregué un comentario entre paréntesis (es posible que desees eliminarlo si no estás de acuerdo) – tzot

+1

Cambiar un proceso "existente", aunque es verdadero, es tangencial. Cambiar el proceso principal es lo que confunde a todos; no está claro para las personas que todos los comandos * nix se ejecutan en un subproceso. –

13

No es posible, para ningún proceso secundario, cambiar el entorno del proceso principal. Lo mejor que puede hacer es dar salida a instrucciones de shell para stdout que luego crea, o escríbalas en un archivo que haya obtenido en el padre.

10

me gustaría utilizar la declaración de fiesta de eval, y tienen la salida del script de Python el código shell

child.py:

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

parent.sh

#!/bin/bash 
eval `./child.py` 
Cuestiones relacionadas