2008-11-04 77 views
15

在Linux中当我从shell中调用python时,它会复制它的环境,并启动python进程。因此,如果我做类似如下的事情:是否有可能在python中更改父进程的环境?

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

当python进程返回,假设它原来未定义的FOO仍然是未定义的。有没有办法让python进程(或任何子进程)修改其父进程的环境?

我知道您通常使用解决一些这个问题就像

source script_name.sh 

但这种冲突的其他要求我。

+0

请参阅此相关的问题: http://stackoverflow.com/questions/205064/is-there-a-way-to-change-another-processs-environment-variables – Davide 2008-11-04 22:20:54

+0

安德鲁从那个线索回答: 通过gdb: (GDB)连接PROCESS_ID (GDB)调用运行putenv( “ENV_VAR_NAME = env_var_value”) (GDB)分离 这是一个非常讨厌的黑客,只应在调试方案的背景下完成的,当然, 。 – grieve 2008-11-06 15:39:21

回答

14

没有进程可以改变其父进程(或任何其他现有进程的环境)。

但是,您可以通过创建具有修改环境的新交互式shell来创建新环境。

您必须生成一个使用升级环境的shell的新副本,并且可以访问现有的stdin,stdout和stderr,并执行其重新初始化跳舞。

你需要做一些事情,比如使用subprocess.Popen来运行/bin/bash -i

所以原来的shell运行Python,它运行一个新的shell。是的,你有很多进程在运行。不,它不是太糟糕,因为除了等待子shell完成以外,原来的shell和Python还没有做任何事情,所以它们也可以干净地退出。

13

对于任何子进程,不可能改变父进程的环境。最好的办法是将shell语句输出到标准输出中,然后将其写入到源文件中。

10

我会使用的bash eval语句,并且有python脚本输出的shell代码

child.py:

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

parent.sh

#!/bin/bash 
eval `./child.py` 
相关问题