2016-03-26 12 views
7

Ich habe eine Konfiguration von os.environ mit Standardwerten (die 90% meiner Bedürfnisse abdecken). Ich habe ein spezielles Application-Framework-Paket, zum Beispiel SALOME, das keine Paketinstallation in Systemumgebung bietet und versucht, eigenständig zu sein, es erfordert auch die Verwendung spezieller alter Technologien, die auf Umgebungsvariablen angewiesen sind, also sys.path und PYTHONPATH nicht sind die einzigen Dinge, die es braucht. Ich kann alle Variablen erhalten, die es benötigt, wenn es os.environ innerhalb einer Umgebung anruft, die er verursacht. Ich kann dann das os.environ Wörterbuch serialisieren.Wie führt man os.environ in Python ein?

Ich frage mich, wie man eine Zusammenführung von os.environ anwenden kann Ich habe auf meinem derzeit laufenden System mit einem ich durch Serialisieren erhalten?

+2

Sie meinen wie 'os.environ.update (deserialized_environment)'? – mgilson

+0

@mqilson: Ja, so etwas. Keine Umzüge - nur Einfügungen und Ergänzungen. – DuckQueen

+1

@DuckQueen und warum genau mgloson Lösung für Sie nicht funktioniert? "os.environ" ist ein Diktat, ein anderes Objekt ist dict, und 'dict.update' würde genau so funktionieren, wie Sie es erklärt haben - dict-Daten werden mit Daten aus dem' update() '- Argument überschrieben. Nicht in Konflikt stehende Schlüssel würden intakt bleiben. –

Antwort

5

Nehmen wir an, Sie so etwas wie das folgende getan haben, die Umwelt zu serialisieren:

import json 
import os 

with open('environ.json', 'w') as f: 
    json.dump(dict(**os.environ), f) 

Sie können nun diejenigen zurück wie folgt aus (in einem anderen Programm) lesen

import json 
import os 

with open('environ.json', 'r') as f: 
    os.environ.update(json.load(f)) 

Dies wird nur hinzufügen oder Ändern Sie die aktuellen Umgebungsvariablen so, dass sie mit den gespeicherten übereinstimmen, aber alle zusätzlichen Variablen bleiben erhalten.

Wenn Sie nur bestimmte Variablen aktualisieren möchten, indem sie das Hinzufügen (so zum Beispiel zusätzliche Pfade hinzufügen), können Sie das explizit tun:

with open('environ.json', 'r') as f: 
    loadedenv = json.load(f) 

pathvars = ['PATH', 'PYTHONPATH'] 

for p in pathvars: 
    os.environ[p] += ':' + loadedenv[p] 
+0

Könnte es bereits vorhandene Strings (zB Pfade) verketten oder ersetzen? – DuckQueen

+0

Es wird vorhandene Werte durch die neuen ersetzen. – chthonicdaemon

+0

@DuckQueen Um Pfade zusammenzuführen, müssen Sie darüber nachdenken, wie - sollten die geladenen Werte vor oder nach den vorhandenen Werten hinzugefügt werden, sollte es einen Zusammenführungsprozess geben? Ich habe eine Methode hinzugefügt, die einfach die neuen Werte am Ende mit ':' separator hinzufügt. – chthonicdaemon

1

Wenn Sie mehrere Werte für ein Wörterbuch haben wollen, die der Standard-Python-Wörterbuch bietet nicht als Sie können

Das Update funktioniert auch auf die gleiche Weise, wie ich unten erwähnt habe.

Wenn Sie die alten Schlüsselwerte vor dem Zusammenführen mit dem neuen Wörterbuch nicht beibehalten möchten, können Sie Folgendes tun.

Da os.environ ein Wörterbuch ist, das Sie bereits im Speicher haben, muss das andere Diktat, aus dem Sie lesen, in json konvertiert werden. Ich benutze im Allgemeinen Ujson, da es wirklich schnell ist.

os.environ.update(new_dict) 

Wenn Sie den JSON speichern möchten, können Sie ihn in eine Datei speichern.

import ujson 

with open('data.json', 'w') as file: 
    ujson.dump(dict(**os.environ), file) 

Wenn Sie die Datei lesen und das os.environ-Wörterbuch aktualisieren möchten, können Sie es verwenden.

with open('environ.json', 'r') as f: 
    os.environ.update(ujson.load(f)) 
+0

Die Einstellung von 'os.environ' auf diese Weise funktioniert nicht, da' os.environ' nicht "nur" ein Wörterbuch ist - es hat Methoden, die tatsächlich die Umgebungsvariablen für die Kinder des Prozesses setzen . Testen Sie mit 'os.system (echo $ Key1)' und Sie werden sehen, dass es nicht gesetzt ist. – chthonicdaemon

3

können Sie das Paket verwenden environs os.environ Wörterbuch Export zu erreichen. Es hat Dumper/Loader für den Export der Umgebungsvariablen eingebaut.

from environs import Env 

env = Env() 
# reading an environment variable 
gh_user = env('GITHUB_USER') # => 'sloria' 
secret = env('SECRET') # => raises error if not set 

# casting 
api_key = env.str('API_KEY') # => '123abc' 
date = env.date('SHIP_DATE') # => datetime.date(1984, 6, 25) 

# serialize to a dictionary of simple types (numbers and strings) 
env.dump() 
# { 'API_KEY': '123abc', 
# 'GITHUB_USER': 'sloria',  
# 'SECRET': 'AASJI93WSJD93DWW3X0912NS2', 
# 'SHIP_DATE': '1984-06-25'}} 
Verwandte Themen