Passing a List to Python From Command Line

后端 未结 4 1570
面向向阳花
面向向阳花 2020-11-29 05:09

I would like to make my python script run from the command line when supplies with some arguments. However, one of the arguments should be a list of options specific to one

4条回答
  •  盖世英雄少女心
    2020-11-29 05:55

    Program:

    import sys, ast, getopt, types
    
    def main(argv):            
        arg_dict={}
        switches={'li':list,'di':dict,'tu':tuple}
        singles=''.join([x[0]+':' for x in switches])
        long_form=[x+'=' for x in switches]
        d={x[0]+':':'--'+x for x in switches}
        try:            
            opts, args = getopt.getopt(argv, singles, long_form)
        except getopt.GetoptError:          
            print "bad arg"                       
            sys.exit(2)       
    
        for opt, arg in opts:        
            if opt[1]+':' in d: o=d[opt[1]+':'][2:]
            elif opt in d.values(): o=opt[2:]
            else: o =''
            print opt, arg,o
            if o and arg:
                arg_dict[o]=ast.literal_eval(arg)
    
            if not o or not isinstance(arg_dict[o], switches[o]):    
                print opt, arg, " Error: bad arg"
                sys.exit(2)                 
    
        for e in arg_dict:
            print e, arg_dict[e], type(arg_dict[e])        
    
    if __name__ == '__main__':
        main(sys.argv[1:])        
    

    Command line:

    python py.py --l='[1,2,3,[1,2,3]]' -d "{1:'one',2:'two',3:'three'}" --tu='(1,2,3)'
    

    Output:

    args:  ['--l=[1,2,3,[1,2,3]]', '-d', "{1:'one',2:'two',3:'three'}", '--tu=(1,2,3)']
    tu (1, 2, 3) 
    di {1: 'one', 2: 'two', 3: 'three'} 
    li [1, 2, 3, [1, 2, 3]] 
    

    This code snippet will take short or long command switches like -l or --li= and parse the text after the switch into a Python data structure like a list, tuple or a dict. The parsed data structure ends up in a dictionary with the long-form switch key.

    Using ast.literal_eval is relatively safe. It can only parse python data definitions.

提交回复
热议问题