python,如何使参数接受参数的组合?
我确实看到了另一篇关于让python参数接受多个输入的帖子,但我认为这不适用于我的问题 我有一个使用命令行执行的脚本,我在这里做了一个参数,我可以输入一个模型,并基于该模型,我的脚本将为我更新一个文件,我可以在另一个程序中使用(这是用于PAML的codeml.ctl文件,以防有人感兴趣) 我以以下方式执行脚本: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 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)),它可以很好地与编号的模型集的任何组合一起打印。非常感谢。