2016-03-26 8 views
7

私の設定はos.environで、デフォルト値(私のニーズの90%をカバーしています)です。私は特別なアプリケーションフレームワークパッケージ、例えばSALOMEと呼ばれ、システム環境にパッケージインストールを提供せず、自己完結型であるようにしようとしています。したがって、環境変数に依存する特殊な古い技術の使用が必要です。sys.pathPYTHONPATHはそれが必要な唯一のものです。それが作成する環境の中でos.environを呼び出すときに必要なすべての変数を取得できます。私はそのos.environ辞書をシリアル化することができます。Pythonでos.environ joinを実行する方法は?

os.environのマージをどのように適用するのでしょうか現在実行中のシステムにシリアル化によって取得したシステムがありますか?

import json 
import os 

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

あなたは次のように戻ってそれらを読むことができます(別のプログラムで)

import json 
import os 

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

にのみ追加されますか:

+2

あなたは 'os.environ.update(deserialized_environment)'のような意味ですか? – mgilson

+0

@mqilson:そうですね。削除はありません - 挿入と追加だけです。 – DuckQueen

+1

@DuckQueenと、なぜ正確にmgilsonのソリューションがあなたのために機能しないのですか? 'os.environ'はdictであり、もう一つのオブジェクトはdictであり、' dict.update'はあなたの説明どおりに動作します.Dictデータは 'update()'引数のデータによって上書きされます。競合しない鍵はそのまま残される。 –

答えて

5

のは、あなたが環境をシリアル化するために、次のようなものを行っていると仮定しましょう保存されている環境変数と一致するように現在の環境変数を変更しますが、追加の変数は残ります。

あなたは(そのインスタンスのための余分なパスを追加する)、それらを追加することによってのみ、特定の変数を更新したい場合は、明示的にそれを行うことができます。

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

pathvars = ['PATH', 'PYTHONPATH'] 

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

すでに存在する文字列(パスなど)を連結したり置換したりしますか? – DuckQueen

+0

既存の値を新しい値に置き換えます。 – chthonicdaemon

+0

@DuckQueenパスをマージするには、ロードされた値を既存の値の前後に追加する必要がありますか?マージ処理が必要なのでしょうか?私は最後に新しい値を ':'セパレータで追加するメソッドを追加しました。 – chthonicdaemon

1

あなたはどの辞書に複数の値を持つようにしたい場合は標準のPython辞書はあなたが使用できる以上に提供していません

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

このアップデートは、私が以下に述べたのと同じように動作します。

新しい辞書でマージする前に古いキー値を保存しない場合は、次の操作を実行できます。

os.environはすでにメモリに格納されている辞書なので、読んでいるものはjsonに変換する必要があります。本当に速いので、私は一般的にujsonを使います。

os.environ.update(new_dict) 

jsonを保存したい場合は、ファイルにダンプできます。

import ujson 

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

ファイルを読み込んで、os.environディクショナリを使用したい場合は、それを更新する必要がある場合。

+0

'os.environ'をこのように設定すると、' os.environ'は辞書だけではなく、実際にプロセスの子の環境変数を設定するメソッドを持っています。 'os.system(echo $ Key1)'を使ってテストすれば、設定されていないことがわかります。 – chthonicdaemon

3

パッケージenvironsを使用すると、os.environ辞書をエクスポートできます。環境変数のインポートをエクスポートするためのdumper/loaderが組み込まれています。

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'}} 
関連する問題