Python参数解析得到错误的结果

时间:2013-09-01 06:10:05

标签: python python-2.6

我有一个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 input.How我可以解析-tm,-ts,-dm,-ds iputs吗?

2 个答案:

答案 0 :(得分: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 :(得分: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