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

19

我试图将一个环境变量存储为Python能够读取的字典。如果这是不好的想法,请告诉我您的建议,我渴望学习。我担心如果将数据作为许多环境变量存储,可能会变得难以管理。

我编写了一段程序,在树莓派上基于来自Twilio号码的来电者ID解锁门禁,它运行得很好。我想分享我的代码到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) 我感觉一定有更好的方法来解决这个问题,但是我在谷歌上搜索的东西似乎都不能解决我面临的问题。请指点我正确的方向。

7个回答

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中。

3
请确保不上传 numbers.json 文件,可以在你的仓库的 .gitignore 中忽略它,或者将其放置在用户的主目录下作为点文件来读取(例如 ~/.numbers.json),从而使其位于仓库之外。如果选择后一种选项,请参考 os.path.expanduser - Lukas Graf

5
如果您选择使用环境变量,您应该将Python字典序列化为JSON,并在设置/获取环境变量时进行转储/加载。您可以使用os模块的environ属性访问环境变量。您可以使用json模块进行转储/加载JSON。如果有这样的事情,您可能需要注意环境变量的最大长度。
如果我是您,我会使用sqlite数据库,请参见https://docs.python.org/2/library/sqlite3.html。这将为您提供持久性、定义的模式和处理数据的良好接口。

5

有一个名为environs的选项,遗憾的是,导出方式与您想要的略有不同,但我会建议您使用,因为它可能是您或其他人的替代品(我需要另一天做这件事)。

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",
}

希望它能够正常工作,因为这正是我所需要的 :-) - Krish Srinivasan

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
作为我不想插入新的包 environs,我尝试了所有其他公开的解决方案,但在Python 3.6中,没有一个适合我。
将此环境变量转换为字典对象的解决方案如下:
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')])

这对我来说很好用(没有不必要的导入)! :)


-2

这是可能的!只需要这样做

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

这有点复杂,但是能够正常工作!


在设置 os.environ['TEST'] = 'test' 时,虽然在 ipython shell 中运行 !echo $TEST 将输出正确的值,但当您开始尝试将字典塞入其中时,它会崩溃。 - jooks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接