我的os.environ
配置有默认值(占我需求的90%)。我有一个特殊的应用程序框架包,例如名为SALOME
,它不提供软件包安装到系统环境中并尝试自包含,它还需要使用依赖环境变量的特殊旧技术{{ {1}}和sys.path
不是唯一需要的东西。当我在它创建的环境中调用PYTHONPATH
时,我可以获得所需的所有变量。然后我可以序列化os.environ
字典。
我想知道如何在我目前正在运行的系统上应用os.environ
与我通过序列化获得的合并?
答案 0 :(得分:6)
假设您已经完成了类似以下的操作来序列化环境:
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))
这只会添加或更改当前环境变量以匹配保存的变量,但任何其他变量都将保留。
如果您只想通过添加特定变量来更新它们(例如添加额外路径),您可以明确地执行此操作:
with open('environ.json', 'r') as f:
loadedenv = json.load(f)
pathvars = ['PATH', 'PYTHONPATH']
for p in pathvars:
os.environ[p] += ':' + loadedenv[p]
答案 1 :(得分:3)
您可以使用包environs来实现导出os.environ字典。它有内置的转储器/加载器,用于导出导入环境变量。
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'}}
答案 2 :(得分:1)
如果您希望为标准python词典提供的字典提供多个值,则可以使用
werkzeug.datastructures.MultiDict
os.environ = MultiDict([('Key1', 'First Value'), ('Key1', 'Second Value')])
更新的工作方式与我在下面提到的方式相同。
如果您不想在与新词典合并之前保留旧键值,则可以执行以下操作。
由于os.environ是你已经在内存中的字典,另一个dict是你正在阅读的字典需要转换为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字典而不是你可以使用。
with open('environ.json', 'r') as f:
os.environ.update(ujson.load(f))