可选参数Python?

可选参数Python?,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我需要创建一个名为extractGenes.py的程序 命令行参数需要采用2或3个参数: -s是一个可选参数或开关,表示用户需要剪接的基因序列(内含子已删除)。用户不必提供这个(意味着他需要整个基因序列),但如果他提供了,那么它必须是第一个参数 输入文件(带基因) 输出文件(程序将在其中创建以存储fasta文件 该文件包含如下行: NM_001003443 chr11 + 5925152 592608098 2 5925152,5925652, 5925404,5926898, def get

我需要创建一个名为extractGenes.py的程序

命令行参数需要采用2或3个参数:

  • -s
    是一个可选参数或开关,表示用户需要剪接的基因序列(内含子已删除)。用户不必提供这个(意味着他需要整个基因序列),但如果他提供了,那么它必须是第一个参数

  • 输入文件(带基因)

  • 输出文件(程序将在其中创建以存储fasta文件

  • 该文件包含如下行:

    NM_001003443 chr11 + 5925152 592608098 2 5925152,5925652, 5925404,5926898,
    
    def getGenes(input, output, s=False):
        if s:
            ...
        else:
            ...
    
    但是,我不确定如何将
    -s
    可选参数包括在启动函数中

    所以我从以下几点开始:

    getGenes(-s, input, output):
    fp = open(input, 'r')
    wp = open(output, "w")
    

    但是我不确定如何包含
    -s

    Argparse是一个python库,它将为您提供可选参数。

    尝试以下方法:

    NM_001003443 chr11 + 5925152 592608098 2 5925152,5925652, 5925404,5926898,
    
    def getGenes(input, output, s=False):
        if s:
            ...
        else:
            ...
    
    如果输入2个参数,s将为False; getGenes(输入、输出)


    如果使用3个参数调用getGenes(),则s将是第3个参数,因此在本例中,使用任何非False值调用它将生成else子句。

    这种情况非常简单,可以直接使用:

    import sys
    
    spliced = False
    if '-s' in sys.argv:
        spliced = True
        sys.argv.remove('-s')
    infile, outfile = sys.argv[1:]
    
    或者,您也可以使用更强大的工具(如和)生成命令行解析器:

    import argparse
    
    parser = argparse.ArgumentParser(description='Tool for extracting genes')
    parser.add_argument('infile', help='source file with the genes')
    parser.add_argument('outfile', help='outfile file in a FASTA format')
    parser.add_argument('-s', '--spliced', action='store_true', help='remove introns')
    
    if __name__ == '__main__':
        result = parser.parse_args('-s myin myout'.split())
        print vars(result)
    

    这里的问题是,不管出于什么原因,-s必须是第一个parameter@PatrickCampbell为什么,为什么命令行上的参数顺序必须反映程序中某些函数的参数顺序?我真的不知道为什么顺序很重要,我希望我不必这样做,但我被指示…@PatrickCampbell-are您确定已指示s必须是函数的第一个参数(这只是内部实现,用户不会看到),而不仅仅是命令行上的第一个参数吗?因为您一直将其称为“-s”,这只是一种命令行参数格式,我猜它可能真的是后者。特别是因为,正如zallarak所说,前者在python中毫无意义。我对python不熟悉,不确定如何将argparse合并到程序中。我理解上面的注释,但由于我需要-s作为第一个参数,我不知道如何将-s作为有条件的…@PatrickCampbell-dm在我输入答案时回答,但我的解决方案恰恰使用了他建议的库(在这种情况下确实是要使用的库…)@RaymondHettinger,非常好,我以前从未使用过argparse。顺便说一句,我在PyCon看到你关于easy AI的演讲,非常棒。@zallarak谢谢,我很高兴你喜欢它:-)