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

时间:2011-05-11 04:15:41

标签: python function command-line parameters

目前这是我的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命令行提供 SJtag 函数的文件 len_tag 参数,如下所示:

python ./TagGen QstartRefseqhg19.head 80

我该怎么做,或者类似的东西?

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

您可以使用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)

如果您使用的是早于2.7的python版本,则应使用optparse模块,以达到类似的效果。

答案 1 :(得分:2)

sys.argv是参数列表,第一个元素是脚本名称。这是一个字符串列表,因此,如果任何参数是数字,则必须使用int()float()进行转换。

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

$ python myscript.py 1 foo bar baz

sys.argv就是这样:

["myscript.py", "1", "foo", "bar", "baz"]

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

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]))

答案 2 :(得分:1)

我建议使用argparse和一个名为plac的好包装器。在你的情况下,你需要做的就是:

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

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

答案 3 :(得分:0)