如何将Python字典存储为环境变量

问题描述 投票:0回答:8

我正在尝试存储一个Python可以作为字典读入的环境变量。如果这是一个坏主意,请告诉我您的建议,我渴望学习。我担心如果我将数据存储为许多环境变量,可能会变得难以管理。

我对 Raspberry Pi 进行了编程,根据 Twilio 号码的来电显示来电解锁门,效果非常好。我想在 Github 上分享我的代码以获取反馈,但我不想与全世界分享我的电话号码列表,因此我尝试将其保存为环境变量,然后让 Python 读取它。

电话号码位于这样的 Python 字典中。

building_admins = {
    "+27792955555": "De Wet",
    "+27722855555": "Marysol",
    "+27878085555": "Blomerus",
}

我正在尝试将其保存为 Ubuntu 14.04 上的环境变量

export BUILDING_ADMINS='{
    "+27792955555": "De Wet",
    "+27722855555": "Marysol",
    "+27878085555": "Blomerus",
}'

1)我无法让 Linux 保存环境变量,我可以做些什么来让它工作吗?

2)我觉得必须有更好的方法来做到这一点,而我正走在错误的方向上,但我似乎无法通过谷歌搜索找到解决我面临的问题的方法。请为我指出正确的方向。

python dictionary environment-variables
8个回答
19
投票

我不知道这是否是您正在寻找的内容,但我在尝试将字典保存为 Linux 环境变量以在我的应用程序上使用它时最终来到这里。

我所做的是将其保存为这样的字符串:

export BUILDING_ADMINS="{'+27792955555': 'De Wet','+27722855555': 'Marysol','+27878085555': 'Blomerus'}'

然后在你的Python代码中读取它并使用它将其转换为字典(取自:将字典的字符串表示形式转换为字典?):

import ast
import os

ba_dict = ast.literal_eval(os.environ["BUILDING_ADMINS"])

如果您输入

type(ba_dict)

你应该看到你的字符串现在是一个字典。

<class 'dict'>

希望这对其他人有帮助!


7
投票

环境变量不是脚本用户想要设置的东西。使用

json
模块和文件:

import json

with open('numbers') as f:
    numbers = json.load(f)

print numbers['+27792955555']    #  De Wet

推送到 GitHub 时,不要提交

numbers
文件。也许提交一个示例并将真实的添加到您的
.gitignore


6
投票

有一个名为“环境”的选项,不幸的是,导出的方式与您想要的有点不同,但我会建议您,因为可以作为您或其他人的替代方案(我需要改天这样做)。

https://pypi.org/project/environs/

pip install environs

您可以通过终端导出,甚至创建一个

.env
文件

export BUILDING_ADMINS=+27792955555=De Wet,+27722855555=Marysol, +27878085555=Blomerus

代码中:

from environs import Env

env = Env()
env.read_env() // to allow reading from .env file

building_admins = env.dict('BUILDING_ADMINS', subcast=str)

结果:

print(building_admins)
{
    "+27792955555": "De Wet",
    "+27722855555": "Marysol",
    "+27878085555": "Blomerus",
}

5
投票

如果您选择使用环境,则应将 Python 字典序列化为 JSON,并在设置/获取环境变量时转储/加载该字典。您可以使用

os
模块的
environ
属性访问环境。您可以使用
json
模块转储/加载 JSON。如果有这样的事情,您可能需要注意环境变量的最大长度。

如果我是你,我会使用 sqlite 数据库,请参阅 https://docs.python.org/2/library/sqlite3.html。这将为您提供持久性、定义的模式以及用于处理数据的良好界面。


1
投票

我建议您使用

environ
,因为该库做了一些额外的安全检查并且已经看到了各种用例。

https://pypi.org/project/environs/

pip install environs

你的

config.py

import environ

# Django cookiecutter does it like this.
env = environ.Env()
ROOT_DIR = (
    environ.Path(__file__)
) # let's say your configs sit at the root of the project and it's called .env
env.read_env(str(ROOT_DIR.path(".env")))

# Your env variable looks like a JSON
# There are multiple types available that you can go for if you don't think JSON is correct.
BUILDING_ADMINS = env.json('BUILDING_ADMINS')
>> from configs import *
>> print(BUILDING_ADMINS)
{
    "+27792955555": "De Wet",
    "+27722855555": "Marysol",
    "+27878085555": "Blomerus"
}
>> type(BUILDING_ADMINS)
<class 'dict'>

0
投票

由于我不想插入新的包环境,所以我尝试了所有其他公开的解决方案,但在 Python 3.6 中,没有一个对我有用。

我将下面的 env 变量转换为 dict 对象的解决方案是:

MY_ENV_VAR_DICT="{'test1':'test1','test2':'test2'}"

代码:

import os

my_dict = eval(os.environ['MY_ENV_VAR_DICT'].replace('"',''))
print(my_dict.items())

输出:

dict_items([('test1', 'test1'), ('test2', 'test2')])

这对我来说效果很好(没有多余的进口)! :)


0
投票

旧线程,但这是我对词典的操作方法:

1- 制作一个压缩的

json
对象:

{"FOO":"BAR","NAME":"JOHN"}

2-对string-dict进行base64编码,所以它变成这样:

eyJGT08iOiJCQVIiLCJOQU1FIjoiSk9ITiJ9

3- 现在你可以

export
将其作为环境变量。

4-在您的代码中对其进行 base64 解码,然后执行

json.dumps(decoded_string)
来获取您的字典:)


-2
投票

这是可能的!就做吧

import os
os.environ.__dict__["_data"]["yourkey"] = {"key":0} #Your data
print (os.environ.__dict__["_data"]["yourkey"]) #Will print out value!

有点复杂,但是有效!

© www.soinside.com 2019 - 2024. All rights reserved.