2017-05-18 81 views
0

我想將我的憑證保存在gitignored的文件(config_vars.env)中。 然後,我想開始我的項目,並將這些憑據設置爲環境變量,因爲我的程序使用os.environ.get('DB_NAME')等。腳本運行時設置虛擬環境變量?

所以我想在我的腳本運行時設置這些環境變量,然後在程序停止運行時刪除它們。

我可以從字面上使用python或bash設置它們,然後在退出時取消設置它們。但是這並不理想,因爲如果我的程序崩潰了,環境變量就會留在那裏。

理想情況下,我可以自動將它們設置在虛擬環境中,只有我的進程可用,並且當進程停止運行時,env變量消失。

有什麼辦法可以在原生python中做到這一點?我已經研究過像click或dotenv for python這樣的東西,但是沒有其他方法嗎?

這裏是我到目前爲止有:

import os 
import subprocess 

def bash_command(): 

    #not good 
    #subprocess.Popen(cmd, shell=False, executable=".\git-bash.exe") 
    #os.popen('setenv a b') 

    subprocess.call("config_vars.sh", shell=False) 
    print(os.environ.get('DB_NAME')) # prints None because the env var dies with bash 
    import time 
    time.sleep(5) # delays for 5 seconds 

bash_command() 

和config_vars.sh是:

export ENV_FILE=env/config_vars.env 
echo $DB_NAME 

呼應命令顯示它的工作,但在bash過程結束,除去環境變量(或整個虛擬環境),python進程繼續訪問而不訪問它。

所以問題是:如何設置當我的python進程死亡時死亡的環境變量?

+0

DB_NAME在哪裏?文件env/config_vars.env中的 –

+0

我認爲它是「export DB_NAME ...」 –

+1

除非您執行'source env/config_vars.env',否則DB_NAME根本不會由該腳本設置。 –

回答

3

您必須捕獲腳本的輸出;孩子不能影響父母的環境,所以你需要某種形式的進程間通信。

value = subprocess.check_output("config_vars.sh", shell=False).lstrip('\n')