在python中处理配置文件的用户友好方式?

在python中处理配置文件的用户友好方式?,python,configuration,Python,Configuration,我想编写一个程序,在某个事件发生时向一个或多个指定的收件人发送电子邮件。为此,我需要用户将邮件服务器的参数写入配置中。可能的值例如:ServerAddress、ports、ssl(true/false)和所需收件人列表 用户友好/最佳实践方法是什么 当然,我可以使用带有正确参数的Python文件,用户必须填写它,但我不认为这是用户友好的。我也读过python中的'config'模块,但在我看来,它是为自己创建配置文件而设计的,而不是让用户自己填写这些文件。你是说配置文件必须是有效的python,

我想编写一个程序,在某个事件发生时向一个或多个指定的收件人发送电子邮件。为此,我需要用户将邮件服务器的参数写入配置中。可能的值例如:ServerAddress、ports、ssl(true/false)和所需收件人列表

用户友好/最佳实践方法是什么


当然,我可以使用带有正确参数的Python文件,用户必须填写它,但我不认为这是用户友好的。我也读过python中的'config'模块,但在我看来,它是为自己创建配置文件而设计的,而不是让用户自己填写这些文件。

你是说配置文件必须是有效的python,这让它变得不友好吗?似乎文件中有行,如:

 server = 'mail.domain.com'
 port = 25
…etc将足够直观,同时仍然是有效的Python。如果您不想让用户知道他们必须引用字符串,那么您可以使用YAML方法。我将YAML完全用于配置文件,并且发现它非常直观,我认为对于最终用户来说也是直观的(尽管它需要第三方模块-):

使用pyyaml加载很简单:

>>> import yaml
>>> yaml.load("""a: 1
... b: foo
... """)
{'a': 1, 'b': 'foo'}
用锉刀也很容易

>>> with open('myconfig.yaml', 'r') as cfile:
...    config = yaml.load(cfile)
... 

配置现在包含所有参数。

我不在乎你的用户是否精通技术;你可以指望他们会把编辑文本文件搞砸。(他们会将其保存在错误的位置。他们会使用MS Word编辑文本文件。他们会打字。)我建议制作一个gui,验证输入并以正确的格式和位置创建配置文件。在Tkinter中创建的简单gui可能适合您的需要。

这种解决方案的缺点是什么:

ch = 'serveradress = %s\nport = %s\nssl = %s'

a = raw_input("Enter the server's address : ")

b = 'a'
bla = "\nEnter the port : "
while not all(x.isdigit() for x in b):
    b = raw_input(bla)
    bla = "Take care: you must enter digits exclusively\n"\
          +"  Re-enter the port (digits only) : "

c = ''
bla = "\nChoose the ssl option (t or f) : "
while c not in ('t','f'):
    c = raw_input(bla)
    bla = "Take care: you must type f or t exclusively\n"\
          +"  Re-choose the ssl option : "


with open('configfile.txt','w') as f:
    f.write(ch % (a,b,c))

PS

我在jonesy的帖子中读到,配置文件中的值可能必须被引用。如果是这样,并且您希望用户不必为自己写引号,只需添加

a = a.join('""')
b = b.join('""')
c = c.join('""')

编辑 我一直在用。它设计用于读取具有以下内容的.ini样式文件:

[section]
option = value
它很容易使用,文档也很容易阅读。基本上,您只需将整个文件加载到ConfigParser对象中:

import ConfigParser    

config = ConfigParser.ConfigParser()
config.read('configfile.txt')
然后,您可以通过检查选项来确保用户没有弄糟任何东西。我用一份清单来说明:

OPTIONS = 
    ['section,option,defaultvalue',
     .
     .
     .
    ]

for opt in OPTIONS:
    section,option,defaultval = opt.split(',')
    if not config.has_option(section,option):
        print "Missing option %s in section %s" % (option,section)
获取这些值也很容易

val = config.get('section','option')
我还编写了一个函数,使用该选项列表创建一个示例配置文件

    new_config = ConfigParser.ConfigParser()
    for opt in OPTIONS:
        section,option,defaultval = opt.split(',')
        if not new_config.has_section(section):
            new_config.add_section(section)
        new_config.set(section, option, defaultval)
    with open("sample_configfile.txt", 'wb') as newconfigfile:
        new_config.write(newconfigfile)
    print "Generated file: sample_configfile.txt"

你应该检查一下,我不明白。用户必须在每次发送电子邮件时写入参数?在这种情况下,为什么要在配置文件中记录参数?使用用户给定的参数创建的字符串中包含的数据是否足够?@eyquem用户应在配置文件中输入一次数据。之后,程序总是从文件中读取它。谢谢你的回答。我担心python可能不是用户友好的,因为需要引用字符串(如您所提到的)和索引。Yaml听起来很棒,ubuntu中甚至有一个python Yaml包。Yaml真的很棒,我经常使用它files@Basil:大多数人都能找到“引号”键并轻松匹配“撇号”。对于英语用户来说,这是标准的,他们都知道怎么做。您的用户不懂英语吗?@S.Lott我不想暗示用户无法理解它。只是不必关心引号和indentation使它更容易。@Basil:对于配置文件,不应该有任何缩进,而应该只有最简单的引号规则。您会发现Python的相关子集通常比所有其他语法选择都简单得多。我同意您的看法。但目前该程序仅为命令行程序,并将保持这种状态一段时间。您仍然可以制作一个程序,请求配置选项并使用
raw\u input
正确保存它们。如果你必须让你的用户直接编辑文件,我会选择joesy的
yaml
答案。我认为总的来说这是个好主意。我所看到的唯一问题是,如果你打错了,你必须重新输入整件事。但我想我会在文件中添加类似于您的(“…您必须以独占方式输入数字”)的注释。@Basil好吧,它可以被更正。给我一点时间,我会建议你改进。
val = config.get('section','option')
    new_config = ConfigParser.ConfigParser()
    for opt in OPTIONS:
        section,option,defaultval = opt.split(',')
        if not new_config.has_section(section):
            new_config.add_section(section)
        new_config.set(section, option, defaultval)
    with open("sample_configfile.txt", 'wb') as newconfigfile:
        new_config.write(newconfigfile)
    print "Generated file: sample_configfile.txt"