2017-05-18 2 views
0

Ich möchte meine Anmeldeinformationen in einer Datei (config_vars.env) speichern, die gitigorned ist. Dann möchte ich mein Projekt starten und diese Anmeldeinformationen auf Umgebungsvariablen festgelegt haben, weil mein Programm os.environ.get('DB_NAME') und dergleichen verwendet.Variable der virtuellen Umgebung einstellen, während das Skript läuft?

Also ich möchte diese Umgebungsvariablen gesetzt werden, während mein Skript ausgeführt wird, dann gelöscht, wenn mein Programm nicht mehr ausgeführt wird.

Ich könnte sie buchstäblich mit Python oder Bash setzen, dann deaktivieren Sie sie beim Beenden. Aber das ist nicht ideal, denn wenn mein Programm abstürzt, bleiben die Umgebungsvariablen dort.

Im Idealfall wäre ich in der Lage, sie automatisch in einer virtuellen Umgebung zu setzen, die nur für meinen Prozess verfügbar ist, und wenn der Prozess aufhört zu laufen, sind die env vars weg.

Gibt es eine Möglichkeit, dies in nativem Python zu tun? Ich habe Dinge wie Click oder Dotenv für Python untersucht, aber gibt es keinen anderen Weg?

Hier ist, was ich bisher habe:

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() 

und config_vars.sh ist:

export ENV_FILE=env/config_vars.env 
echo $DB_NAME 

Das Kommando echo zeigt, dass es funktioniert, aber die Bash-Prozess endet, dass die Umwelt zu entfernen Variable (oder die gesamte virtuelle Umgebung insgesamt) und der Python-Prozess wird fortgesetzt, ohne Zugriff darauf zu haben.

Also die Frage ist: Wie kann ich Umgebungsvariablen setzen, die sterben, wenn mein Python-Prozess stirbt?

+0

wo ist DB_NAME festgelegt? –

+0

in der Datei env/config_vars.env Ich denke, es ist "export DB_NAME ..." –

+1

DB_NAME wird überhaupt nicht durch das Skript gesetzt, es sei denn Sie tun 'Quelle env/config_vars.env'. –

Antwort

3

Sie müssen die Ausgabe des Skripts erfassen; Das Kind kann die Umgebung der Eltern nicht beeinflussen. Daher benötigen Sie eine Art Interprozesskommunikation.

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