BT源代码学习心得(二):程序运行参数的获取
发信人: wolfenstein (NeverSayNever), 个人文集
标 题: BT源代码学习心得(二):程序运行参数的获取
发信站: 水木社区 (Sat Jul 30 21:08:27 2005), 文集
标 题: BT源代码学习心得(二):程序运行参数的获取
发信站: 水木社区 (Sat Jul 30 21:08:27 2005), 文集
(本文包含HTML标记,终端模式下可能无法正确浏览)
把这部分单独列举出来,是因为我觉得BT的程序在处理配置参数方面的这部分代码很有
参考价值。
程序的配置参数首先来源于BitTorrent/defaultargs.py。这个模块中包含了一些参数
的默认值,由于它们是直接编译进BT的模块中,因此即使其它的配置文件都丢失后,程序还
是有一些默认值可以作为参数。defaultargs.py中定义了一个函数get_defaults可以让各个
可执行模块得到它们对应的默认值。例如btdownloadgui和btmaketorrentgui得到的默认值
是不同的。而且defaultargs.py中为可执行模块生成的默认属性集合是一个以三元组为元素
的列表。每一个三元组代表一条属性(也就是一条程序的配置参数),每个三元组包含了属性
的名称,属性的值和该属性的说明。值得注意的是,在后面我们可以看到,属性的说明直接
作为帮助信息输出给用户。
在获取完默认值后,各个可执行模块通常都调用BitTorrent/configfile.py中的函数
parse_configuration_and_args来进一步从可能存在的配置文件和命令行参数中对程序运行
的一些参数进行调整。这个函数中首先从配置文件中获取信息,值得一提的是它获取配置文
件的方法。BT将在用户的"主目录"下建立一个.bittorrent的目录,并且从这里读取配置文
件(如果这个文件不存在就建立一个,下次就存在了)。其中"主目录"的获取方法在
BitTorrent/__init__.py中,它的实现方法比较巧妙,利用了python的os和os.path库进行
操作,可以针对不同的操作系统使用合适的方法得到这个"主目录"。在windows下,这个目
录通常是文档和设置目录下的用户名目录下的"Application Data",而在linux下这个目录
把这部分单独列举出来,是因为我觉得BT的程序在处理配置参数方面的这部分代码很有
参考价值。
程序的配置参数首先来源于BitTorrent/defaultargs.py。这个模块中包含了一些参数
的默认值,由于它们是直接编译进BT的模块中,因此即使其它的配置文件都丢失后,程序还
是有一些默认值可以作为参数。defaultargs.py中定义了一个函数get_defaults可以让各个
可执行模块得到它们对应的默认值。例如btdownloadgui和btmaketorrentgui得到的默认值
是不同的。而且defaultargs.py中为可执行模块生成的默认属性集合是一个以三元组为元素
的列表。每一个三元组代表一条属性(也就是一条程序的配置参数),每个三元组包含了属性
的名称,属性的值和该属性的说明。值得注意的是,在后面我们可以看到,属性的说明直接
作为帮助信息输出给用户。
在获取完默认值后,各个可执行模块通常都调用BitTorrent/configfile.py中的函数
parse_configuration_and_args来进一步从可能存在的配置文件和命令行参数中对程序运行
的一些参数进行调整。这个函数中首先从配置文件中获取信息,值得一提的是它获取配置文
件的方法。BT将在用户的"主目录"下建立一个.bittorrent的目录,并且从这里读取配置文
件(如果这个文件不存在就建立一个,下次就存在了)。其中"主目录"的获取方法在
BitTorrent/__init__.py中,它的实现方法比较巧妙,利用了python的os和os.path库进行
操作,可以针对不同的操作系统使用合适的方法得到这个"主目录"。在windows下,这个目
录通常是文档和设置目录下的用户名目录下的"Application Data",而在linux下这个目录
就是~。
在parse_configuration_and_args中,还要调用BitTorrent/parseargs.py模块中的
parseargs对命令行中输入的参数进行处理。根据其中的注释,可以看出程序将会把以下格
式的参数作为一种控制方面的操作(options)而改变原来的配置,其它的参数都只是简单得
堆在args数组中供可执行模块自己去处理。这些格式有--aaa 1型,即以两个-号开头的参数
,将和他后面的参数一起,构成一个配置项(aaa=1),-a1型,即以一个-号开头的参数,直
接取一个字母作为配置项的属性名,这个参数后面的子字符串作为配置项的属性值(a=1),
-a 1型,即以一个-号开头的参数,但是后面只有一个字母,就将下一个参数作为属性值(因
此这里也是a=1)。
经过这些处理后,程序的其它部分就可以很方便得使用配置好的参数了,例如:
if self.config['xxx']
.......
或者
aaa = self.config['bbb']
等等。
在parse_configuration_and_args中,还要调用BitTorrent/parseargs.py模块中的
parseargs对命令行中输入的参数进行处理。根据其中的注释,可以看出程序将会把以下格
式的参数作为一种控制方面的操作(options)而改变原来的配置,其它的参数都只是简单得
堆在args数组中供可执行模块自己去处理。这些格式有--aaa 1型,即以两个-号开头的参数
,将和他后面的参数一起,构成一个配置项(aaa=1),-a1型,即以一个-号开头的参数,直
接取一个字母作为配置项的属性名,这个参数后面的子字符串作为配置项的属性值(a=1),
-a 1型,即以一个-号开头的参数,但是后面只有一个字母,就将下一个参数作为属性值(因
此这里也是a=1)。
经过这些处理后,程序的其它部分就可以很方便得使用配置好的参数了,例如:
if self.config['xxx']
.......
或者
aaa = self.config['bbb']
等等。