我想argparse
在Python中使用以下方法声明参数:
./get_efms_by_ids [-h] [-v] [inputfile [1 3 4 9] [-c 11..18] [20 25 40]]
在这种情况下,我想做的是:
如果inputfile
使用,则可以接受两种类型的可选参数:1 3 4 9
或c 11..18
或同时使用这两种参数。如果我不输入inputfile
,则必须缺少可选参数。
例如:我可以向您展示一些命令行用法示例:
./get_efms_by_ids Vacf.txt // default: get 1 or 10 first lines in Vacf.txt
./get_efms_by_ids Vacf.txt 1 3 4 9 // get the lines that indexes: 1 3 4 9 in Vacf.txt
./get_efms_by_ids Vacf.txt c 11..18 22 25 29 // get the lines that indexes are from 11 to 18, then the lines 22, 25, 29
./get_efms_by_ids c 11.. 18 // shows a readable error message
./get_efms_by_ids 1 3 4 9 // shows a readable error message
在下面的示例中,可以使用args='?'
或args='*'
喜欢:
parser = argparse.ArgumentParser(description='Selecting some Elementary Flux Modes by indexes.',version='1.0')
parser.add_argument('efm_matrix_file', type=file, help='give the name of the efms matrix file')
parser.add_argument('ids', nargs='?', help='give the indexes of the chosen efms')
parser.add_argument('-i','--indexes',nargs='*', help='give the begin and start indexes of the chosen efms')
但是结果并不满足本文开头提出的目的。
任何帮助将不胜感激。
首先,我将放弃该-c
选项。您无需同时使用-c
和..
来指示值的范围。这样可以简化您的通话,例如
./get_efms_by_ids [-h] [-v] [inputfile [index ...]]
其中每个index
可以是单个整数,也可以是由指定的范围lower..upper
。
这样,参数解析器可能很简单
def index_type(s):
try:
return int(s)
except ValueError:
try:
return map(int, s.split(".."))
except:
raise ArgumentTypeError("Invalid index: %s" % (s,))
p = ArgumentParser()
p.add_argument("-h")
p.add_argument("-v")
p.add_argument("inputfile", nargs="?")
p.add_argument("indices", nargs="*", type=index_type)
args = p.parse_args()
if not (args.inputfile is None or os.path.exists(args.inputfile)):
sys.exit("Invalid file name: %s" % (args.inputfile,))
解析后,您必须检查第一个位置参数(如果有)是否是有效文件,因为任何任意字符串都可以是有效文件名。
该index_type
函数只是在解析过程中如何转换每个索引(无论是整数还是范围)的示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句