Django使用真正的Python文件进行设置,Trac使用.ini文件,其他一些软件使用XML文件来保存这些信息。
Guido和/或Python社区的其中一种方法是否比其他方法更受欢迎?
答案 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文件是有意义的,因为它们可以被各种其他应用程序/库操纵。