Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中执行os.environ连接?_Python_Python 2.7_Environment Variables - Fatal编程技术网

如何在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作为包装器向环境中简单地添加所需的值?@Rogalski
os.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'}}