2008-11-04 74 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` 
相關問題