2013-09-01 2 views
0

У меня есть сценарий питона для разбора входного аргумента от пользователя .my кода, как этогоPython аргумент синтаксического получить неверный результат

def get_arg(argv): 
    result = {} 
    input_file=stag_db=main_tb=stag_table=main_table = ""; 
    debug="N" 

    msg = '''  Syntax: dt transaction date 
         -i input_file (E.g. input_file.tar.gz) 
         -ds staging_database 
         -dm main_database 
         -ts staging_table 
         -tm main_table 
         -db debug (Y/N)''' 
    try: 
     opts, args = getopt.getopt(argv,"hd:i:ds:dm:db:ts:tm:",["ifile=","ofile="]) 
     print args 
     print opts 
    except getopt.GetoptError: 
     f_end_process(msg) 
    for opt, arg in opts: 
     if opt == '-h': 
      f_end_process(msg) 
     elif opt == "-i": 
      input_file = arg 
     elif opt == "-ds": 
      stag_db = arg 
     elif opt == "-dm": 
      main_tb = arg 
     elif opt == "-ts": 
      stag_table = arg 
     elif opt == "-tm": 
      main_table = arg 
     elif opt == "-db": 
      debug = arg 
    result = {'input_file':input_file,'stag_db':stag_db,'main_tb':main_tb,'stag_table':stag_table,'main_table':main_table} 
    print result 
    if '' in result.values(): 
     exit_status=-1 
     f_end_process(msg) 
    result['debug']= debug 
    return result 

def main(): 
    global input_arg 
    input_arg = get_arg(sys.argv[1:]) 
    print "process started at " +strftime("%Y-%m-%d %H:%M:%S") 
    print input_arg 

Я бег кода как этого

python main.py -i ok.txt -ds ds_val -dm dm_val -ts tas_val -tm tm_val 

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

теперь я могу разобрать только -i. Как я могу разобрать -tm, -ts, -dm, -ds iputs?

+0

Вы должны передать 'sys.argv [1:]', а не 'argv'. Я не знаю достаточно о 'getopt', чтобы сказать, все ли это проблема. – user2357112

+0

Я прохожу как sys.argv [1:]. – user2602709

+0

Можете ли вы показать фактический код, который запускается и демонстрирует проблему при запуске? – user2357112

ответ

1

Вы можете управлять с помощью argparse всего несколькими строками.

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--input-file', '-i', type=str, 
         help='input file (eg: input_file.tar.gz)') 
    parser.add_argument('--staging-db', '-S', type=str, 
         help='staging database name') 
    parser.add_argument('--main-db', '-M', type=str, 
         help='main database name') 
    parser.add_argument('--staging-table', '-s', type=str, 
         help='staging table name') 
    parser.add_argument('--main-table', '-m', type=str, 
         help='main table name') 
    parser.add_argument('--debug', '-d', type=bool, default=False, 
         help="activate debug mode (defaults to False)") 
    args = parser.parse_args() 

С помощь парсера создается argparse. Вы можете вывести его, набрав

$ python YOURSCRIPT.py --help 
1

В интерактивном эксперименте Python с прохождением различных argv массивов getopt

>>> getopt.getopt(['-hd','1'],"hd:i:ds:dm:db:ts:tm:") 
([('-h', ''), ('-d', '1')], []) 

Вы не сказать ему, чтобы искать -hd вариант, а скорее -h и -d, который принимает аргумент.

Как правило, для параметров мультиплеер парсер аргументов ожидает, что вы используете --. Ваш Getopt должен быть

>>> getopt.getopt(['--hd','1'],"i:",["hd=","ds=",...]) 
([('--hd', '1')], []) 

Но, не считают argparse.

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