如何通过命令行为python脚本的函数提供参数?

2024-10-01 13:41:59 发布

您现在位置:Python中文网/ 问答频道 /正文

目前这是我的python脚本(TagGen),它有一个函数:

def SJtag(file,len_tag):

    import csv
    reader = csv.reader(open(file), dialect='excel-tab' )
    for row in reader:
        qstarts = row[1].split(",")[1:-1] 
        n = len_tag/2
        for i in qstarts:  
            name = row[0]

            start = int(i)-n
            if start<0:
                start = 0      

            end = int(i)+n
            if end>len(row[2]):
                end=len(row[2])

            tag = row[2][start:end]    
            print name, i, tag, len(tag)

SJtag("QstartRefseqhg19.head",80)

我想使用bash comand line给出SJtag函数的文件len峈标记参数,如下所示:

^{pr2}$

我该怎么做,或者类似的事情?

谢谢你的帮助!在


Tags: csv函数nameinforlentagstart
3条回答

我建议使用argparse和一个很好的包装器^{}。在你的情况下,你需要做的就是:

if __name__ == '__main__':
    import plac; plac.call(SJtag)

…并且plac将处理所有事情,因为它能够从函数的签名中找出要使用的命令行参数。非常酷,查看文档了解更多(它可以做更多)。在

你可以用argparse module来表示。在

从文件上看

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
           help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
           const=sum, default=max,
           help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)

如果您使用的python版本早于2.7,那么应该使用optparse模块来实现类似的效果。在

sys.argv是参数列表,第一个元素是脚本名称。这是一个字符串列表,因此如果任何参数是数字,则必须使用int()或{}来转换它们。在

所以,如果你这样调用脚本:

$ python myscript.py 1 foo bar baz

sys.argv将是:

^{pr2}$

在您的情况下,您可以将脚本设置为:

import sys
import csv

def SJtag(file,len_tag):
    reader = csv.reader(open(file), dialect='excel-tab' )
    for row in reader:
        qstarts = row[1].split(",")[1:-1] 
        n = len_tag/2
        for i in qstarts:  
            name = row[0]

            start = int(i)-n
            if start<0:
                start = 0      

            end = int(i)+n
            if end>len(row[2]):
                end=len(row[2])

            tag = row[2][start:end]    
            print name, i, tag, len(tag)

if __name__ == '__main__':
    SJtag(sys.argv[1], int(sys.argv[2]))

相关问题 更多 >