2013-05-23 3 views
0

я пишу свои скрипты питона и запускать их с ЦМД, набрав:Pass аргументов из ЦМДА в питон скрипт

C:\> python script.py 

Некоторые из моих сценариев содержат отдельные алгоритмы и методы, которые вызываются на основе флага. Теперь я хотел бы передать флаг через ЦМД непосредственно вместо того, чтобы идти в сценарий и изменить флаг перед бежать, я хочу что-то подобное:

C:\> python script.py -algorithm=2 

Я прочитал, что люди используют sys.argv для почти подобных целей, но, читая руководства и форумы, я не мог понять, как это работает.

+1

Вы проверили модуль [argparse] (http://docs.python.org/2.7/library/argparse.html) ? Его документация достаточно ясна и должна вас начать. –

+0

@PierreGM Я этого раньше не видел, означает ли это, что я могу добавить 'parser = argparse.ArgumentParser()' и 'parser.add_argument (('- Алгоритм") 'и' args = parser.parse_args() 'в моем скрипте, а затем в cmd-типе в' C: \> python script.py --Algorithm = 2', так что Алгоритм установлен в 2, а скрипт python будет запускать задачи, связанные с algoritm 2? –

ответ

3

Есть несколько модулей, специализирующихся на разборе аргументов командной строки: , optparse и argparse. optparse устарел, и getopt менее эффективен, чем argparse, поэтому я советую вам использовать последнее, это будет более полезно в долгосрочной перспективе.

Вот краткий пример:

import argparse 
# Define the parser 
parser = argparse.ArgumentParser(description='Short sample app') 
# Declare an argument (`--algo`), telling that the corresponding value should be stored in the `algo` field, and using a default value if the argument isn't given 
parser.add_argument('--algo', action="store", dest='algo', default=0) 
# Now, parse the command line arguments and store the values in the `args` variable 
args = parser.parse_args() 
# Individual arguments can be accessed as attributes... 
print args.algo 

Это должно вам начать. В худшем случае есть много документации, доступной в режиме онлайн (скажем, this one, например) ...

+0

разработано из коробки, Cheers –

0

Пробуйте использовать модуль getopt. Он может обрабатывать как короткие и длинные параметры командной строки и осуществляется аналогичным образом на других языках (C, оболочки сценариев и т.д.):

import sys, getopt 


def main(argv): 

    # default algorithm: 
    algorithm = 1 

    # parse command line options: 
    try: 
     opts, args = getopt.getopt(argv,"a:",["algorithm="]) 
    except getopt.GetoptError: 
     <print usage> 
     sys.exit(2) 

    for opt, arg in opts: 
     if opt in ("-a", "--algorithm"): 
      # use alternative algorithm: 
      algorithm = arg 

    print "Using algorithm: ", algorithm 

    # Positional command line arguments (i.e. non optional ones) are 
    # still available via 'args': 
    print "Positional args: ", args 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

Вы можете затем передать указать другой алгоритм, используя -a или --algorithm= варианты:

python <scriptname> -a2    # use algorithm 2 
python <scriptname> --algorithm=2 # ditto 

См: getopt documentation

+0

Спасибо за ответ, всего несколько простых вопросов: 1. Какова вероятность того, что 'if __name__ ==" __main __ ":'? 2. Это определение, так что я могу или я должен, вероятно, сохранить его в отдельном скрипте python, а затем вызвать в моем фактическом скрипте by 'from xxx import *', а затем 'if __name__ ==" __main__ ": main (sys.argv [1:])'? –

+0

@Kevin Bell, тест для '__name__ ==" __main __ "' вернет true, если сценарий запускается из командной строки, а не импортируется в интерпретаторе python или другом скрипте. Дизайн зависит от вас - если вы программируете самостоятельно в этом одиночном скрипт, то вы можете просто добавить '__name__ ==" __main __ "' test, чтобы он запускался из командной строки. В противном случае, если вы импортируете скрипт, вам придется передать параметры argv на вызов main(). – ccbunney

+0

У меня были проблемы с этим, не знаю почему, но спасибо в любом случае. Я получил то, что хотел с Пьером ГМ. Все лучшее –

Смежные вопросы