如何在python中执行os.environ连接?
我有一个带有默认值的如何在python中执行os.environ连接?,python,python-2.7,environment-variables,Python,Python 2.7,Environment Variables,我有一个带有默认值的os.environ配置(覆盖了我90%的需求)。我有一个特殊的应用程序框架包,例如名为SALOME,它不提供安装到系统环境中的包,并尝试自包含,它还需要使用依赖于环境变量的特殊旧技术,因此它需要的不仅仅是路径和PYTHONPATH。当它开始在它创建的环境中调用os.environ时,我可以得到它需要的所有变量。然后我可以序列化该os.environ字典 我想知道如何将我当前运行的系统上的os.environ与我通过序列化获得的系统进行合并?假设您已执行以下操作来序列化环境:
os.environ
配置(覆盖了我90%的需求)。我有一个特殊的应用程序框架包,例如名为SALOME
,它不提供安装到系统环境中的包,并尝试自包含,它还需要使用依赖于环境变量的特殊旧技术,因此它需要的不仅仅是路径和PYTHONPATH。当它开始在它创建的环境中调用os.environ
时,我可以得到它需要的所有变量。然后我可以序列化该os.environ
字典
我想知道如何将我当前运行的系统上的
os.environ
与我通过序列化获得的系统进行合并?假设您已执行以下操作来序列化环境:
import json
import os
with open('environ.json', 'w') as f:
json.dump(dict(**os.environ), f)
现在,您可以像这样读回这些内容(在另一个程序中)
这将仅添加或更改当前环境变量以匹配保存的环境变量,但任何其他变量都将保留
如果您只想通过添加特定变量来更新它们(例如添加额外路径),您可以显式地这样做:
with open('environ.json', 'r') as f:
loadedenv = json.load(f)
pathvars = ['PATH', 'PYTHONPATH']
for p in pathvars:
os.environ[p] += ':' + loadedenv[p]
如果希望为标准python字典不提供的字典提供多个值,则可以使用
werkzeug.datastructures.MultiDict
os.environ = MultiDict([('Key1', 'First Value'), ('Key1', 'Second Value')])
更新的工作方式也将与我在下面提到的相同
如果不希望在与新词典合并之前保留旧的键值,则可以执行以下操作
由于os.environ是一个已经存在于内存中的字典,另一个dict是您正在读取的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))
您可以使用该包实现导出os.Enviro字典。它内置了用于导出和导入环境变量的转储程序/加载程序
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'}}
你的意思是像os.environment.update(反序列化的_环境)?@mkilson:是的,类似这样的东西。没有删除-只是插入和添加。@DuckQueen为什么mgilson的解决方案不适合您
os.environ
是一个dict,另一个对象是dict,dict.update
将如您所解释的那样工作-dict数据将被update()
参数中的数据覆盖。没有冲突的密钥将保持不变。是什么阻止您在实际启动应用程序之前使用批处理或shell作为包装器向环境中简单地添加所需的值?@Rogalskios.environ
不是dict
。它是一个os.\u Environ
实例。它提供了一个dict
接口,但当您设置值等时,它实际上改变了与进程相关的真实环境。它会连接或替换现有字符串(例如路径)?它会用新值替换现有值。@DuckQueen要合并路径,您需要考虑如何在现有值之前或之后添加加载的值,是否有合并过程?我添加了一个方法,该方法仅使用:
分隔符将新值添加到末尾。以这种方式设置os.environ
不起作用,因为os.environ
不仅仅是一个字典,它有一些方法可以为流程的子级实际设置环境变量。使用os.system(echo$Key1)
进行测试,您将看到它没有设置。
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'}}