python,如何使参数接受参数的组合?

时间:2018-02-16 19:09:42

标签: python argparse args

我确实看到另一篇关于使python args接受多个输入的帖子,但我认为这不适用于我的问题。

我有一个使用命令行执行的脚本,我做了一个参数,我可以输入一个模型,基于模型,我的脚本将为我更新一个文件,我可以在另一个程序中使用(这是代码。如果有兴趣的话,PAML的ctl文件。)

我执行脚本:

python my_script.py -g=geneA.phy -t=treefile.phy -M="0 1 2 3"

但有时我可能只想重新运行一个模型:

-M=0

或许我想重新运行两个随机模型

-M="0 3"

在我的python脚本中,我根据我的-M标志的模型输入设置它,我在控制文件中编辑行。

def main():
    parser = argparse.ArgumentParser(description="Update codeml.ctl file using model names")
    parser.add_argument('-M', '--modeltype', type=str)
    parser.add_argument('-g', '--genefile', type=str)
    parser.add_argument('-t', '--treefile', type=str)
    args = parser.parse_args()

def lines_to_replace(args):
    replace_seq = args.genefile
    replace_treefile = args.treefile
    replace_outfile = args.genefile.split(".phy")[0] + "_OUT"

def model(args):
    for index, line in enumerate(fileinput.input('codeml.ctl', inplace=1)):
        if args.modeltype == '0 1 2 3':
             if index == 30:
                 line = "Model is 0 1 2 3"; print(line)
        if args.modeltype == '0 1 2':
             if index == 30:
                 line = "Model is 0 1 2"; print(line)

我会这样做,但这很乏味,我无法找到一种方法让我的args.modeltype接受模型输入的组合。实际文件只接受模型输入,中间有空格,它必须在一行上。它必须是这样的:

 if args.modeltype == ???:
      if index == 30:
           line = "Model is" + str(???); print(line)

组合总是让我困惑。像* args这样的东西会起作用,但那我将如何解析* args?也许使用用户输入并保存作为变量可以工作?我之前从未使用过它,但我会尝试一下。

编辑更清晰:

我希望我的模型参数接受来自此模型列表[0,1,2,3]的参数。我可以输入0,或者我可以输入“0 1”甚至“2 3”,脚本应该执行并适当地更新模型行(index == 30)。但是,如果我键入“9 99”是错误的,因为这些模型不存在。下面的建议适用于我使用nargs =“+”然后“”.join(args.model),但这仍然接受不正确的输入。 有没有办法将接受的模型列表输入到我的parser.add_argument('model',type ='str',nargs ='+',help ='输入模型')。

1 个答案:

答案 0 :(得分:1)

如果您使用以下内容替换了-M参数:

parser.add_argument('models', metavar='N', type=int, nargs='+',
                help='list of models to run')

然后args.models将是您指定的模型列表,如

python my_script.py -g=geneA.phy -t=treefile.phy 0 1 2 3

会导致args.models成为['0', '1', '2', '3'],然后您可以随意执行任何操作(说实话,您的问题根本不清楚您对此信息的处理方式)。< / p>

相关问题