【问题标题】:Optional Parameter Python?可选参数 Python?
【发布时间】:2012-05-02 21:51:22
【问题描述】:

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

命令行参数需要取2 OR 3个参数:

  1. -s 是可选参数或开关,表示用户想要拼接的基因序列(去除内含子)。用户不必提供这个(意味着他想要整个基因序列),但他确实提供了它,那么它必须是第一个参数

  2. 输入文件(带有基因)

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

该文件包含如下行:

NM_001003443 chr11 + 5925152 592608098 2 5925152,5925652, 5925404,5926898,

但是,我不确定如何将-s 可选参数包含到启动函数中。

所以我开始了:

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

但不确定如何包含-s

【问题讨论】:

    标签: python command-line-arguments argparse


    【解决方案1】:

    Argparse 是一个 python 库,它将为您处理可选参数。 http://docs.python.org/library/argparse.html#module-argparse

    【讨论】:

    • 我是 python 新手,不确定如何将 argparse 合并到程序中。我理解上面的评论,但由于我需要 -s 作为第一个参数,所以我不明白如何使它有条件......
    • @PatrickCampbell - dm 在我输入答案时回答,但我的解决方案正是使用他建议的库(在这种情况下确实是 the 库... )
    【解决方案2】:

    试试这样的:

    def getGenes(input, output, s=False):
        if s:
            ...
        else:
            ...
    

    如果输入2个参数,s将为False; 获取基因(输入,输出)

    如果你用 3 个参数调用 getGenes(),s 将是第三个参数,所以在这种情况下,用任何非 False 值调用它都会产生 else 子句。

    【讨论】:

    • 这里的问题是,不管什么原因,-s 必须是第一个参数
    • @PatrickCampbell 为什么,为什么命令行上的参数顺序必须反映程序中某些函数的参数顺序?
    • 我真的不知道为什么顺序很重要,我希望我不必这样做,但我被指示...
    • @PatrickCampbell - 你确定你被告知 s 必须是 function 的第一个参数(这只是内部实现,用户不会看到它),而不仅仅是命令行上的第一个参数?鉴于您一直将其称为“-s”,它只是一种命令行参数格式,我猜它可能真的是后者。特别是因为正如 zallarak 所说,前者在 python 中毫无意义。
    【解决方案3】:

    这个案例很简单,直接使用sys.argv

    import sys
    
    spliced = False
    if '-s' in sys.argv:
        spliced = True
        sys.argv.remove('-s')
    infile, outfile = sys.argv[1:]
    

    或者,您也可以使用更强大的工具,如argparseoptparse 来生成命令行解析器:

    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)
    

    【讨论】:

    • @RaymondHettinger,非常好,我以前没有使用过 argparse。顺便说一句,我在 PyCon 上看到了你关于简易 AI 的演讲,非常棒。
    • @zallarak 谢谢,很高兴你喜欢它:-)
    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 2018-11-16
    • 2019-07-12
    • 2017-09-02
    • 1970-01-01
    • 2017-11-28
    • 2019-11-17
    • 2015-07-14
    相关资源
    最近更新 更多