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

时间:2014-09-13 18:37:15

标签: python dictionary environment-variables

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

我编写了一个Raspberry Pi,根据来电号码拨打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)我觉得必须有一个更好的方法来做到这一点,我走错了方向,但我似乎找不到谷歌搜索正在解决我面临的问题。请指出我正确的方向。

6 个答案:

答案 0 :(得分:4)

如果选择使用环境,则应将Python字典序列化为JSON,并在设置/获取环境变量时转储/加载。您可以使用os模块的environ属性访问环境。您可以使用json模块转储/加载JSON。如果存在这样的事情,您可能需要注意环境变量的最大长度。

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

答案 1 :(得分:4)

环境变量不是脚本用户想要设置的东西。使用json模块和文件:

import json

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

print numbers['+27792955555']    #  De Wet

上传到github时,请不要上传号码文件或上传虚假文件。

答案 2 :(得分:3)

我不知道这是不是你要找的东西,但我在尝试将字典保存为Linux环境变量时最终会在我的应用中使用它。

我所做的就是把它保存为这样的字符串:

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

然后在你的python代码中你读它并使用它将其转换成字典(取自:Convert a String representation of a Dictionary to a dictionary?):

import ast
import os

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

如果您输入

type(ba_dict)

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

<class 'dict'>

希望这有助于其他人!

答案 3 :(得分:1)

不幸的是,有一个名为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",
}

答案 4 :(得分:0)

我建议您使用 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'>

答案 5 :(得分:-1)

有可能!只是做

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

它有点复杂但有效!