14.1.4.3 参数来源
在目前为止的例子中,提供给解析器的参数列表要么是显式传入的一个列表,要么隐式地从sys.argv取参数。有一些类命令行指令并非来自命令行(如配置文件中的指令),使用argparse处理这种命令时,显式地传入列表会很有用。
import argparse
from configparser import ConfigParser
import shlex
parser = argparse.ArgumentParser(description='Short sample app')
parser.add_argument('-a',action="store_true",default=False)
parser.add_argument('-b',action="store",dest="b")
parser.add_argument('-c',action="store",dest="c",type=int)
config = ConfigParser()
config.read('argparse_with_shlex.ini')
config_value = config.get('cli','options')
print('Config :',config_value)
argument_list = shlex.split(config_value)
print('Arg List:',argument_list)
print('Results :',parser.parse_args(argument_list))
这个例子使用configparse读取一个配置文件。
[cli]
options = -a -b 2
利用shlex可以很容易地分解存储在配置文件中的字符串。
在应用代码中处理配置文件还有一种做法,可以使用fromfile_prefix_chars告诉argparse如何识别一个指定输入文件的参数(这个文件中包含一组要处理的参数)。
import argparse
import shlex
parser = argparse.ArgumentParser(description='Short sample app',
fromfile_prefix_chars='@',
)
parser.add_argument('-a',action="store_true",default=False)
parser.add_argument('-b',action="store",dest="b")
parser.add_argument('-c',action="store",dest="c",type=int)
print(parser.parse_args(['@argparse_fromfile_prefix_chars.txt']))
这个例子在发现一个有@前缀的参数时会停止,然后读取指定的文件来查找更多参数。
处理argparse_from_prefix_chars.txt文件时生成的输出如下。