如何在python中执行os.environ加入?

时间:2016-03-26 04:40:17

标签: python python-2.7 environment-variables

我的os.environ配置有默认值(占我需求的90%)。我有一个特殊的应用程序框架包,例如名为SALOME,它不提供软件包安装到系统环境中并尝试自包含,它还需要使用依赖环境变量的特殊旧技术{{ {1}}和sys.path不是唯一需要的东西。当我在它创建的环境中调用PYTHONPATH时,我可以获得所需的所有变量。然后我可以序列化os.environ字典。

我想知道如何在我目前正在运行的系统上应用os.environ与我通过序列化获得的合并?

3 个答案:

答案 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))