2016-03-26 17 views
7

Ho una configurazione di os.environ con valori predefiniti (che coprono il 90% delle mie esigenze). Ho uno speciale pacchetto di applicazioni, ad esempio chiamato SALOME, che non fornisce l'installazione del pacchetto nell'ambiente di sistema e cerca di essere autonomo, richiede anche l'uso di vecchie tecnologie speciali che si basano su variabili ambientali quindi sys.path e PYTHONPATH non sono le uniche cose di cui ha bisogno. Posso ottenere tutte le variabili necessarie quando ha iniziato a chiamare os.environ all'interno di un ambiente che crea. Posso quindi serializzare il dizionario os.environ.Come eseguire os.environ join in python?

Mi chiedo come applicare un'unione di os.environ sul mio sistema attualmente in esecuzione con quello ottenuto con la serializzazione?

+2

Intendi 'os.environ.update (deserialized_environment)'? – mgilson

+0

@mqilson: sì qualcosa del genere. Nessuna rimozione - solo inserzioni e aggiunte. – DuckQueen

+1

@DuckQueen e perché esattamente la soluzione di mgilson non funziona per te? 'os.environ' è un dict, un altro oggetto è dict e' dict.update' funzionerebbe proprio come hai spiegato tu - i dati dict saranno sovrascritti dai dati dall'argomento 'update()'. Le chiavi non conflittuali verrebbero lasciate intatte. –

risposta

5

Supponiamo che hai fatto qualcosa di simile a quanto segue per serializzare l'ambiente:

import json 
import os 

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

È ora possibile leggere chi è rimasto come questo (in un altro programma)

import json 
import os 

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

Questo sarà solo aggiungere o cambia le variabili di ambiente correnti per farle corrispondere a quelle salvate, ma rimarranno tutte le variabili aggiuntive.

Se si desidera aggiornare solo le variabili specifiche con l'aggiunta di loro (così ad esempio per aggiungere percorsi in più), è possibile farlo in modo esplicito:

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

pathvars = ['PATH', 'PYTHONPATH'] 

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

Potrebbe concatenare o sostituire stringhe già esistenti (ad es. Percorsi)? – DuckQueen

+0

Sostituirà i valori esistenti con quelli nuovi. – chthonicdaemon

+0

@DuckQueen Per unire i percorsi, è necessario pensare a come - se i valori caricati vengono aggiunti prima o dopo i valori esistenti, dovrebbe esserci un processo di fusione? Ho aggiunto un metodo che aggiunge semplicemente i nuovi valori alla fine con ':' separator. – chthonicdaemon

1

Se si desidera avere più valori per un dizionario, che la dizionario standard di Python non offre quello che può utilizzare

werkzeug.datastructures.MultiDict 
os.environ = MultiDict([('Key1', 'First Value'), ('Key1', 'Second Value')]) 

l'aggiornamento funziona anche nello stesso modo come ho già detto qui di seguito.

Se non si desidera conservare i valori della chiave precedente prima di unire con il nuovo dizionario, è possibile eseguire quanto segue.

Poiché os.environ è un dizionario che hai già in memoria, l'altro dt è quello che stai leggendo dovrebbe essere convertito in json. Generalmente uso ujson dato che è molto veloce.

os.environ.update(new_dict) 

Se si desidera salvare il json, è possibile scaricarlo in un file.

import ujson 

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

se si desidera leggere il file e aggiornare il dizionario os.environ di quanto sia possibile utilizzare.

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

L'impostazione 'os.environ' in questo modo non funziona, dato che' os.environ' non è "solo" un dizionario - ha metodi che in realtà impostano le variabili d'ambiente per i figli del processo . Prova usando 'os.system (echo $ Key1)' e vedrai che non è impostato. – chthonicdaemon

3

È possibile utilizzare il pacchetto environs per raggiungere l'esportazione os.environ dizionario. Ha un caricatore/caricatore integrato per esportare l'importazione delle variabili d'ambiente.

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'}} 
Problemi correlati