存储python程序设置的官方方式是什么?

时间:2009-06-08 16:13:02

标签: python settings

Django使用真正的Python文件进行设置,Trac使用.ini文件,其他一些软件使用XML文件来保存这些信息。

Guido和/或Python社区的其中一种方法是否比其他方法更受欢迎?

13 个答案:

答案 0 :(得分:29)

正如许多人所说,没有“官方”的方式。但是,有很多选择。今年有a talk at PyCon个许多可用选项。

答案 1 :(得分:28)

取决于主要的目标受众。

如果是程序员无论如何都要更改文件,只需使用像settings.py

这样的python文件

如果是最终用户,请考虑ini文件。

答案 2 :(得分:14)

不知道这是否可以被视为“官方”,但它位于标准库中:14.2. ConfigParser — Configuration file parser

显然,这是不是的通用解决方案。只需使用最适合任务的任何东西,没有任何必要的复杂性(特别是 - 图灵完整性!考虑自动或GUI配置器)。

答案 3 :(得分:14)

我使用了一个架子(http://docs.python.org/library/shelve.html):

shelf = shelve.open(filename)
shelf["users"] = ["David", "Abraham"]
shelf.sync() # Save

答案 4 :(得分:8)

还有一个选项,PyQt。 Qt具有独立于平台的方式来存储QSettings类的设置。在引擎盖下,在Windows上它使用注册表,在linux中它将设置存储在隐藏的conf文件中。 QSettings工作得很好,而且很无聊。

答案 5 :(得分:6)

我不确定是否存在'官方'方式(在Python的Zen中没有提及:) :) - 我倾向于自己使用Config Parser模块,我认为你会发现这很常见。我更喜欢python文件方法,因为你可以回写它并在需要时动态重新加载。

答案 6 :(得分:6)

据我所知,没有幸福的解决方案。存储应用程序设置没有正确或错误的方式,只要你很舒服,xml,json或所有类型的文件都可以。对于python,我个人使用pypref它非常简单,跨平台且直截了当。

pypref非常有用,因为可以存储静态和动态设置和首选项......

for (var i = 1; i <= 3; i++) {
    for (var ii = 1; ii <= 12; ii++) {
        var getPR = "SELECT top 1 kg, rep, date FROM Test WHERE exerVariName = 'Comp' AND exercise = @0 AND rep = @1 order by kg desc";
        db.Execute(getPR, i, ii);
        foreach (var get in db.Query(getPR, i, ii)) {
            DateTime Date = get.Date;
            var finalDate = Date.ToString("MMM d, yyyy");
            var weight = get.kg + "kg";
            var reps = "x " + get.rep;
            <a>@weight @reps - @finalDate</a>
            <br>
        }
    }
}

答案 7 :(得分:4)

这在很大程度上取决于您的配置有多复杂。如果您正在进行简单的键值映射,并且您希望能够使用文本编辑器编辑设置,我认为ConfigParser是可行的方法。

如果您的设置很复杂并且包含列表和嵌套数据结构,我将使用XML或JSON并创建配置编辑器。

对于非常复杂的事情,不希望最终用户更改设置或更可信,只需创建一组Python类并评估Python脚本以获得配置。

答案 8 :(得分:2)

对于Web应用程序,我喜欢使用OS环境变量:os.environ.get('CONFIG_OPTION')

这对于在部署之间变化的设置尤其有用。您可以在此处详细了解使用env vars背后的基本原理:http://www.12factor.net/config

当然,这仅适用于只读值,因为对环境的更改通常不会持久。但如果您不需要写访问权限,那么这是一个非常好的解决方案。

答案 9 :(得分:2)

最简单的方法之一是使用json模块。 将文件保存在config.json中,详细信息如下所示。

将数据保存在json文件中:

{

    "john"  : {
        "number" : "948075049" , 
        "password":"thisisit" 
    }    
}

从json文件中读取:

import json

#open the config.json file 

with open('config.json') as f:
    mydata = json.load(f) ; 

#Now mydata is a python dictionary 

print("username is " , mydata.get('john').get('number') , " password is " , mydata.get('john').get('password')) ;

答案 10 :(得分:1)

不是官方的,但是这种方式对我所有的Python项目都适用。

pip install python-settings

此处的文档:https://github.com/charlsagente/python-settings

您需要一个settings.py文件,其中包含所有已定义的常量,例如:

# settings.py

DATABASE_HOST = '10.0.0.1'

然后,您需要设置一个环境变量(export SETTINGS_MODULE =设置)或手动调用configure方法:

# something_else.py

from python_settings import settings
from . import settings as my_local_settings

settings.configure(my_local_settings) # configure() receives a python module

该实用程序还支持重载对象的惰性初始化,因此,当您运行python项目时,它加载速度更快,因为它仅在需要时评估设置变量

# settings.py

from python_settings import LazySetting
from my_awesome_library import HeavyInitializationClass # Heavy to initialize object

LAZY_INITIALIZATION = LazySetting(HeavyInitializationClass, "127.0.0.1:4222") 
# LazySetting(Class, *args, **kwargs)

只需配置一次,然后在需要的地方调用变量:

# my_awesome_file.py

from python_settings import settings 

print(settings.DATABASE_HOST) # Will print '10.0.0.1'

答案 11 :(得分:0)

为什么Guido会祝福他的范围之外的东西?没有什么特别的祝福。

答案 12 :(得分:0)

更方便。每个人都没有正式的说法。但是使用XML文件是有意义的,因为它们可以被各种其他应用程序/库操纵。

相关问题