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

dew*_*wet 10 python dictionary environment-variables

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

我编写了一个Raspberry Pi解锁门,根据来电号码拨打Twilio号码的来电ID,它运行良好.我想在Github上分享我的代码以获得反馈,但我不想与世界分享我的电话号码列表,因此我试图将其保存为环境变量,然后让Python读取它.

电话号码在这样的Python字典中.

building_admins = {
    "+27792955555": "De Wet",
    "+27722855555": "Marysol",
    "+27878085555": "Blomerus",
}
Run Code Online (Sandbox Code Playgroud)

我试图在Ubuntu 14.04上将其保存为环境变量

export BUILDING_ADMINS='{
    "+27792955555": "De Wet",
    "+27722855555": "Marysol",
    "+27878085555": "Blomerus",
}'
Run Code Online (Sandbox Code Playgroud)

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

2)我觉得必须有一个更好的方法来做到这一点,我走错了方向,但我似乎找不到谷歌搜索正在解决我面临的问题.请指出我正确的方向.

Die*_*ano 12

我不知道这是否是您要查找的内容,但我在尝试将字典另存为 Linux 环境变量以在我的应用程序上使用它时结束了这里。

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

export BUILDING_ADMINS="{'+27792955555': 'De Wet','+27722855555': 'Marysol','+27878085555': 'Blomerus'}'
Run Code Online (Sandbox Code Playgroud)

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

import ast
import os

ba_dict = ast.literal_eval(os.environ["BUILDING_ADMINS"])
Run Code Online (Sandbox Code Playgroud)

如果你输入

type(ba_dict)
Run Code Online (Sandbox Code Playgroud)

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

<class 'dict'>
Run Code Online (Sandbox Code Playgroud)

希望这对其他人有帮助!


sho*_*app 6

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

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


Thi*_*tim 6

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

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

pip install environs
Run Code Online (Sandbox Code Playgroud)

您可以通过终端导出甚至创建.env文件

export BUILDING_ADMINS=+27792955555=De Wet,+27722855555=Marysol, +27878085555=Blomerus
Run Code Online (Sandbox Code Playgroud)

在代码中:

from environs import Env

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

building_admins = env.dict('BUILDING_ADMINS', subcast=str)
Run Code Online (Sandbox Code Playgroud)

结果:

print(building_admins)
Run Code Online (Sandbox Code Playgroud)
{
    "+27792955555": "De Wet",
    "+27722855555": "Marysol",
    "+27878085555": "Blomerus",
}
Run Code Online (Sandbox Code Playgroud)


enr*_*cis 5

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

import json

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

print numbers['+27792955555']    #  De Wet
Run Code Online (Sandbox Code Playgroud)

当上传到github时,不要上传数字文件或上传伪造的文件。

  • 确保不上传`numbers.json`,方法是忽略它在仓库的.gitignore中,或者将其放置并从用户主目录中的点文件中读取,因此不在仓库中(例如,〜/ .numbers) .json`)。如果选择后者,也请参见[`os.path.expanduser`](https://docs.python.org/2/library/os.path.html#os.path.expanduser)。 (3认同)