Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python,如何使参数接受参数的组合?_Python_Argparse_Args - Fatal编程技术网

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

python,如何使参数接受参数的组合?,python,argparse,args,Python,Argparse,Args,我确实看到了另一篇关于让python参数接受多个输入的帖子,但我认为这不适用于我的问题 我有一个使用命令行执行的脚本,我在这里做了一个参数,我可以输入一个模型,并基于该模型,我的脚本将为我更新一个文件,我可以在另一个程序中使用(这是用于PAML的codeml.ctl文件,以防有人感兴趣) 我以以下方式执行脚本: python my_script.py -g=geneA.phy -t=treefile.phy -M="0 1 2 3" 但有时我可能只想重新运行一个模型,因此: -M=0 或者我

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

我有一个使用命令行执行的脚本,我在这里做了一个参数,我可以输入一个模型,并基于该模型,我的脚本将为我更新一个文件,我可以在另一个程序中使用(这是用于PAML的codeml.ctl文件,以防有人感兴趣)

我以以下方式执行脚本:

python my_script.py -g=geneA.phy -t=treefile.phy -M="0 1 2 3"
但有时我可能只想重新运行一个模型,因此:

-M=0
或者我想重新运行两个随机模型

-M="0 3"
在我的python脚本中,我进行了设置,因此基于my-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,也可以键入“01”甚至“23”,脚本应该执行并适当地更新模型行(索引==30)。然而,如果我输入“9 99”,那是错误的,因为这些模型不存在。下面的建议适用于我使用nargs=“+”和“.join(args.model)的情况,但仍然接受不正确的输入。
是否有方法将接受模型的列表输入到我的解析器中。添加_参数('model',type='str',nargs='+',help='input model')

如果将
-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']
,然后您可以对其执行任何操作(老实说,您的问题根本不清楚如何使用此信息)。

看起来您希望在不做任何更改的情况下将参数放入文件中。为什么
line=“Model is”+args.modeltype
对您不起作用?但是如果args.modeltype==???换成,这样才能起作用。这一部分让我困惑,我如何设置变量,使其不等于自身。你根本不需要
if
语句。我确实需要它,因为文件中有一些其他模型可以运行,然后我需要编辑一系列其他参数-M=TR将是一个不同的模型集,因此我为什么使用if语句。我不确定我是否完全理解了您的问题,但是像
str.split
这样的东西是否可以拆分参数(modeltype)并处理每个模型号?我如何将该输入保存为变量以在if语句中使用?如果args.model==args.model?出于某种原因,这一部分真的让我困惑。部分问题是你似乎把每一个可能的模型集都当作一个单一的模型。我想你只需要检查
args.models
是否为空,然后执行类似于
print(“Model is{}.format(“.join(args.models)))
的操作。是的,你是对的,我将每个组合都视为一个模型,我不应该这样做。谢谢成功了。我仍然保持循环,因为还有其他模型可以(单独)使用,并且可以在if-else语句的末尾使用:line='Model is{}.format(“.join(args.Model)),它可以很好地与编号的模型集的任何组合一起打印。非常感谢。