argparse:多参数处理

Posted

技术标签:

【中文标题】argparse:多参数处理【英文标题】:Argparse: Multiple argument processing 【发布时间】:2017-11-26 00:37:19 【问题描述】:

我是 argparse 的初学者,我对以下代码有疑问:

def (x,y,z,t):

......
def main():

    parser=argparse.ArgumentParser(description= "Get Mapped Single PDB File")
    parser.add_argument("-pdb", dest="pdbfile",
                       help="Single Template PDB File")
    parser.add_argument("-sf", dest="file_of_seq",
                       help="Reference Seq File",)
    parser.add_argument("-rid", dest="refseqID", nargs=2,
                       help="Reference Seq ID")
    parser.add_argument("-cid", dest="chainID", nargs=2,
                       help="Chain ID")
    args=parser.parse_args()

    get_mapped_single_pdb(args.pdbfile, args.file_of_refseq, args.rid, args.cid)


if __name__=="__main__":
    main()

我想做多处理或在 bash 屏幕上放置两个参数(我不知道该怎么称呼它),如下所示:

--python xxx.py -pdb abc -sf ghj -rid qwe bnm -cid jkl tyu

并且“-rid”的第一个参数应该与“-cid”的第一个参数相关 而“-rid”的第二个参数应该是......类似于......

我尝试了很多方法,但我无法弄清楚。你有什么建议吗?

【问题讨论】:

实际的-rid-cid 参数值是多少? -rid 是参考序列 id 为 P08293 , -cid 是链 id 以将 pdb 文件提取为 A 、 B 或 C 。我想这样做让假设 P08293 与链 A 相关,P09134 与链B。我有机会这样跑吗? -rid P08293 P09134 -cid A B. 我想运行一次。并在不同情况下给我所有结果。谢谢! 【参考方案1】:

使用我期望的解析器和命令行

args.rid  # ['qwe', 'bnm']
args.cid  # ['jkl', 'tyu']

将第一个、第二个值等配对是标准的 Python 列表处理。

调试时我建议做一个

print(args)

看看解析器给你什么。

你试过什么?有什么问题?


Namespace(chainID=['A', 'B'], 
          file_of_seq='uniprot_Marc_Vidal.fasta', 
          pdbfile='1VLG_A_14-155::1VLG_C_18-159#1.pdb', 
          refseqID=['P02792_A96T', 'P02794'])

您可以轻松地将这两个列表与标准 for zip 语法配对:

In [120]: for id1, id2 in zip(args.chainID, args.refseqID):
     ...:     print(id1,id2)
     ...:     
     ...:     
A P02792_A96T
B P02794

或索引迭代:

In [122]: for i in range(2):
    ...:     print(args.chainID[i], args.refseqID[i])

【讨论】:

命名空间(chainID=['A', 'B'], file_of_seq='uniprot_Marc_Vidal.fasta', pdbfile='1VLG_A_14-155::1VLG_C_18-159#1.pdb', refseqID=[ 'P02792_A96T'、'P02794'])。当我运行脚本一次时,我想这样做,首先运行带有 P02792_A96T 的链 A,然后运行带有 P02794 的 B。 我添加了一个使用for ...zip 对列表值进行配对的示例。 感谢您的关注,但我还有另一个问题:TypeError: cannot concatenate 'str' and 'list' objects。我应该更改我的脚本还是有什么方法可以在没有列表的情况下使用您的脚本,因为 nargs 正在创建列表而我的脚本不接受列表对象?谢谢 你没有告诉我们脚本接受什么。 nargs=2 的 2 个参数生成列表,参数生成字符串。您已相应地处理它们。

以上是关于argparse:多参数处理的主要内容,如果未能解决你的问题,请参考以下文章

Python 处理脚本的命令行参数:使用argparse

Python命令行参数处理之argparse模块

使用 argparse 处理不确定的成对参数

如何通过批处理文件执行 Python 代码并传递参数 - 使用 argparse

Python argparse 以不同的方式处理参数

python argparse命名位置参数?