Как я могу дать параметры функции скрипта Python через командную строку? - PullRequest
1 голос
/ 11 мая 2011

В настоящее время это мой скрипт на 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)

Я хочу дать file и len_tag параметры функции SJtag , используя командную строку bash, примерно так:

python ./TagGen QstartRefseqhg19.head 80

Как я могу это сделать, или что-то подобное?

Спасибо за вашу помощь!

Ответы [ 4 ]

3 голосов
/ 11 мая 2011

Для этого вы можете использовать модуль argparse .

Из документов:

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 , чтобы добиться аналогичного эффекта.

2 голосов
/ 11 мая 2011

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]))
1 голос
/ 11 мая 2011

Я бы порекомендовал argparse и красивую обертку для него под названием plac. В вашем случае все, что вам нужно сделать, это:

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

... и plac будут обрабатывать все, так как может определить аргументы командной строки для использования из сигнатуры вашей функции . Очень круто, посмотрите документы для большего (это может сделать намного больше).

0 голосов
/ 11 мая 2011

Просто обратитесь к этому.

http://www.dalkescientific.com/writings/NBN/python_intro/command_line.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...