2016-03-26 14 views
7

os.environ numaralı bir yapılandırmam var (varsayılan değerlerin% 90'ını kapsamaktadır). Sistem ortamına paket yüklemesi sağlamayan ve kendi kendine yeten olmaya çalışan, SALOME olarak adlandırılan özel bir uygulama çerçevesi-paket paketim var, ayrıca çevresel değişkenlere dayanan özel eski teknolojilerin kullanılmasını gerektirir, böylece sys.path ve PYTHONPATH İhtiyacı olan tek şey. Yarattığı bir ortamda os.environ'u aramaya başladığında ihtiyaç duyduğu tüm değişkenleri alabilirim. O zaman os.environ sözlüğünü serileştirebilirim.os.environ python'a nasıl katılınır?

os.environ numaralı birleştirme işlemini nasıl uygulayabileceğimi merak ediyorum Şu anda çalışan sistemimde serileştirme ile elde ettiğim bir tane var mı?

import json 
import os 

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

Artık bu şekilde geri iken okuyabilirsiniz (başka bir programda)

import json 
import os 

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

Bu yalnızca katacak ya:

+2

Yani "os.environ.update (deserialized_environment)' gibi mi? – mgilson

+0

@mqilson: evet öyle bir şey. Taşınma yok - sadece ekleme ve eklemeler. – DuckQueen

+1

@DuckQueen ve neden tam olarak mgilson çözümü sizin için çalışmıyor? "os.environ" bir dict, başka bir nesne dict ve 'dict.update 'açıkladığınız gibi çalışacak - dict data' update() 'argümanından verilerle yazılacak. Çakışan olmayan anahtarlar bozulmadan bırakılacaktı. –

cevap

5

Diyelim ki çevreyi seri hale getirmek aşağıdaki gibi bir şey yapmış varsayalım Mevcut ortam değişkenlerini kayıtlı olanlarla eşleştirmek için değiştirin, ancak diğer değişkenler kalacaktır. Eğer ekleyerek sadece belirli değişkenler güncellemek istiyorsanız

(ekstra yolları eklemek için örneğin bu yüzden), açıkça bunu yapabilir:

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

pathvars = ['PATH', 'PYTHONPATH'] 

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

Mevcut dizeleri (örn. Yollar) birleştirir veya değiştirir mi? – DuckQueen

+0

Mevcut değerleri yenileriyle değiştirir. – chthonicdaemon

+0

@DuckQueen Yolları birleştirmek için, birleştirilmiş bir sürecin olması halinde, yüklü değerlerin mevcut değerlerden önce mi yoksa sonra mı ekleneceğini düşünmelisiniz. Ayırıcı ile yeni değerleri sonuna kadar ekleyen bir yöntem ekledim. – chthonicdaemon

1

bir sözlük için birden fazla değere sahip olmak istiyorsanız hangi Ayrıca aşağıda belirttiğim gibi aynı şekilde çalışacaktır

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

güncelleme kullanabilirsiniz daha standart piton sözlük sunmaz.

Eski anahtar değerleri yeni sözlüğüyle birleştirmeden önce korumak istemiyorsanız, aşağıdakileri yapabilirsiniz.

os.environ belleğinizde zaten var olan bir sözlük olduğundan, diğer dict okuduğunuz, json'a dönüştürülmesi gereken bir dict. Genellikle çok hızlı olduğu için ujson kullanıyorum.

os.environ.update(new_dict) 

json'u kaydetmek isterseniz, dosyayı bir dosyaya atabilirsiniz. Dosyayı okumak ve kullanabildiğiniz os.environ sözlüğünü güncelleştirmek isterseniz,

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

olarak kabul edilmelidir Bu şekilde çalışmaz, 'os.environ' bir sözlük değil - sadece sözlük gibi - bu süreçteki çocukların çevre değişkenlerini belirleyen yöntemleri vardır. . Os.system (echo $ Key1) 'yi kullanarak test edin ve ayarlanmadığını göreceksiniz. – chthonicdaemon

3

Sen sözlüğe os.environ ihraç ulaşmak için paket environs kullanabilirsiniz. Ortam değişkenlerini dışa aktarmak için dahili damperli/yükleyiciye sahiptir.

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'}} 
İlgili konular