【发布时间】:2016-02-02 12:06:50
【问题描述】:
我使用argparse 来解析我的脚本的参数。现在我想编写一个运行特定工具的程序,如果第一个参数(在程序名称之后)是工具的名称(在类中关闭)。例如,如果我想运行“计数器”工具,我必须输入:
python myscript.py counter filename
如果我想运行“fasta2bed”,我必须输入:
python myscript.py fasta2bed filename
我编写了这段代码,但您似乎无法使用 Argparse 跳过位置参数:
import argparse
parser=argparse.ArgumentParser(
usage="""python myscript.py {toolname} filename [-option]""",
description='''Description.''',
epilog="""Epilog.""")
parser.add_argument('counter', nargs='?', choices=['counter'], help='count how many features are in the input file [-l][-s]')
parser.add_argument('fasta2bed', nargs='?', choices=['fasta2bed'], help='read sequences in FASTA format and print out BED format')
parser.add_argument('filename', help='the input file name')
parser.add_argument('-l', '--long', action='store_true', help='retrive a long summary file (default)')
parser.add_argument('-s', '--short', action='store_true', help='retrive a short summary file')
args=parser.parse_args()
问题是当我尝试运行python myscript.py fasta2bed filename 时它不起作用,因为它需要counter。
所以我尝试将所有内容插入到这样的单个参数中:
parser.add_argument('tool', nargs='?', choices=['counter', 'fasta2bed'], help='help')
以此为目标:
data = open("inputfile", "r")
if args.tool == "counter":
counter(data).summarize() #summarize is a function present in the counter class
elif args.tool == "fasta2bed":
fasta2bed(data) #fasta2bed is just a function
但它不起作用,因为它运行 counter 而不是 fasta2bed...
我怎样才能做到这一点?
【问题讨论】:
-
你有没有看过docopt(github.com/docopt/docopt)它更容易使用
-
我觉得这会很有用,非常感谢!