我确实看到另一篇关于使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 ='输入模型')。
答案 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>