Passing a List to Python From Command Line

后端 未结 4 1572
面向向阳花
面向向阳花 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:43

    argparse is nice for this, it's in the standard library as of 2.7 and 3.2 but otherwise a pip install away.

    Your main concern of specifying a variable-length list can be addressed by making the list interpreted as a single argument in the shell by using quotes (could depend on your shell I suppose):

    % python prog.py 'name title address' spam
    

    where prog.py contains

    import sys
    my_list = sys.argv[1].split() 
    # my_list is ['name', 'title', 'address']
    if 'name' in my_list:
       do_something()
    

    or similar. Use an argument with split to delimit your list:

    % python prog.py "you're a foo, lift the bar"
    
    my_list = [x.strip() for x in  sys.argv[1].split(',')]
    # my_list is ["you're a foo", "lift the bar"]
    

    But please use argparse instead; especially if you want to use use -c style flags.

    One way to interpret your question is:

    "I'm already using argparse, since that's the sensible way to interpret command line arguments in Python. How do I specify that some options are within a specific category?"

    In your question you've shown an example of something the shells I use of would choke on;

    % python prog.py -v -details=['name', 'title', 'address'] --quickly -t 4
    

    wouldn't make it to python to be parsed because they'd use spaces to separate arguments and might use [ and ] as shell syntax.

    I suggest the following instead

    % python prog.py -v --details name title address --quickly -t 4
    

    where a prog.py file of

    import argparse
    
    parser = argparse.ArgumentParser() 
    parser.add_argument('-v', action='store_true')
    parser.add_argument('--details', nargs='*')
    parser.add_argument('--quickly', action='store_true')
    parser.add_argument('-t')
    
    args = parser.parse_args()
    #args is Namespace(details=['asdf', 'a', 'a'], quickly=False, t='4', v=True)
    details = args.details
    #details is ['asdf', 'a', 'a']
    

    Now, as per your question, you didn't have to do the string parsing yourself.

提交回复
热议问题