>>> from env_helper import info; info()
页面更新时间: 2023-12-27 09:29:37
运行环境:
Linux发行版本: Debian GNU/Linux 12 (bookworm)
操作系统内核: Linux-6.1.0-16-amd64-x86_64-with-glibc2.36
Python版本: 3.11.2
4.5. 深入掌握ConfigParser¶
几乎所有的应用程序真正运行起来的时候都会有传入的参数,这些参数有时会通过一个或几个配置文件存储。
参数或配置文件的意义在于用户不需要修改程序代码,就可以改变应用程序的行为,让它更好地为应用服务。
比如 pytint
就带有一个参数 --rcfile
用以指定配罝文件,实现对定义代码风格的检测。
常见的配置文件格式有 .xml
和 .ini
等,其中在MS Windows系统上
.ini
文件格式用得尤其多,
甚至操作系统的API也都提供了相关的接口函数来支持它。 类似 .ini
的文件格式在Linux 等操作系统中也是极常用的,比如 pylint
的配置文件就是这个格式。 Python
3中有个标准库来这种格式的文件读写与处理,名称为 configparser
。
在 Python 2 中这个模块名称为 `ConfigParser` 。
ConfigParser的基本用法通过手册可以掌握,
但是仍然有几个知识点值得在这里跟大家说一下首先就是 getboolean()
这个函数。 getboolean()
根据一定的规则将配置项的值转换为布尔值,如以下的配置:
[sectioxil ] optionl=0
当调用 getbooleanf('section1', 'opdoin1')
时,将返回 False。不过
getboolean()
的真值规则值得一说: 除了 0
之外, no
、
false
和 off
都会被转义为 False
; 而对应的 1
、 yes
、 true
和 on
则都被转义为 True
,
其他值都会导致抛出ValueError异常。 这样的设计非常贴心,使得我们
能够在不同的场合使用 yes/no
、 true/false
、 on/off
等更切合自然语言语法的词汇,提升配置文件的可维护性。
除了 getboolean()
之外,还需要注意的是配置项的査找规则。 首先,在
ConfigParser
支持的配置文件格式里,有一个 [DEFAULT]
节,
当读取的配置项在不在指定的节里时, ConfigParser将会到 [DEFAULT]
节中査找。
举个例子,有如下配置文件:
$ cat example.conf [DEFAULT] in_default = 'an option value in default' [secticon1]
簡单地编写一段程序尝试通过sectionl获取in default的值()
$ cat readini.py
import ConfigParser conf = ConfigParser-ConfigParser () conf.read('example.conf') print (conf.get('section1', 'in—default'))
>>> import configparser
>>> conf = configparser.ConfigParser ()
>>> conf.read( 'example.conf ' )
>>>
>>> conf.sections()
['section']
>>> conf.get('section', 'addr')
"'test'"
可见ConfigParser的行为跟上文描述是一致的。
不过,除此之外,还有一些机制导致 项目对配置项的査找更复杂, 这就是class
ConfigParser构造函数中的defaults形参以及其
get(section, option[,raw[, vars]])
中的全名参数 vars()
。
如果把这些机制全部用上,那么配置项 值的查找规则如下:
如果找不到节名,就抛出NoSectionEnror。
如果给定的配置项出现在
get()
方法的vars参数中,则返回vars参数中的值。如果在指定的节中含有给定的配置项,则返回其值。
如果在
[DEFAULT]
中有指定的配置项,则返回其值。如果在构造函数的defaults参数中有指定的配置项.则返回其值。
抛出 NoOptionError。
因为篇幅所限,这里就不提供示例了,大家可以自行构造相应的例子来验证。 接下来要 讲的是第三个特点。大家知道,在Python中字符串格式化可以使用以下语法:
>>> '%(protocol)s ://%(server)s:%(port)s/' %{'protocol': 'http', 'server': 'example.com', 'port':1080}
'http ://example.com:1080/'
其实ConfigParSerS持类似的用法,所以在配置文件中可以使用。如,有如下配a选项:
$ cat format.conf [DEFAULT] conn_sti:= % (dbn) s://% (user) s: % (pw) s@% (host) s r % (port> s/% (db) s dbn = mysql user - root host=localhost port = 3306
[dbl]
user = aaa pw=ppp db=example
[db2]
host=192.168.0.110 pw=www db=example
这是一个很常见的SQLAlchemy应用程序的配置文件,通过这个配置文件能够获取不同
的数据库配置相应的连接字符串,即conn_str。如你所见,conn_str定义在[DEFAULT]
中.
但当它通过不同的节名来获取格式化后的值时,根据不同配置,得到不同的值。先来看以下
代码:
$ cat readformatini.py import ConfigParser conf = ConfigParser.ConfigParser () conf.read('format-conf ') print( conf.get ( 'dbl ’ , ' conn_str ' )) print( conf.get ('db2' ,'conn_str'))
非常简单的代码,就是通过ConfigParser获取db]和db2两个节的配置3然后看如下输出:
$ python readformatini.py mysql :ffa.aa: ppp@localhost: 3306/example mysql ://root :www0192.16S . 0»110 : 3306/example
可以看到,当通过不同的节名调用get()方法时,格式化conn_str的参数是不同的,这 个规则跟上述查找配置项的规则相同。