【问题标题】:How to store a Python dictionary as an Environment Variable如何将 Python 字典存储为环境变量
【发布时间】:2014-11-07 16:50:38
【问题描述】:

我正在尝试将 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


    【解决方案1】:

    我不知道这是否是您要查找的内容,但我在尝试将字典保存为 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'>
    

    希望这对其他人有帮助!

    【讨论】:

      【解决方案2】:

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

      import json
      
      with open('numbers') as f:
          numbers = json.load(f)
      
      print numbers['+27792955555']    #  De Wet
      

      推送到 GitHub 时,不要提交 numbers 文件。也许提交一个示例并将真实的添加到您的.gitignore

      【讨论】:

      • 确保不要上传numbers.json,方法是在你的仓库的.gitignore 中忽略它,或者将它放置并从用户主目录中的点文件中读取它,因此在仓库之外(例如~/.numbers.json)。如果您选择后一个选项,另请参阅os.path.expanduser
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 希望它有效,因为这正是我需要的:-)
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          有可能!做吧

          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 将输出正确的值,但当您开始尝试将字典填充到其中时,它会爆炸。
          猜你喜欢
          • 2017-06-17
          • 1970-01-01
          • 2020-04-23
          • 2017-07-31
          • 1970-01-01
          • 2010-09-28
          • 2015-04-26
          • 2014-04-23
          • 1970-01-01
          相关资源
          最近更新 更多