Argparse optional positional arguments?

I have a script which is meant to be used like this: usage: installer.py dir [-h] [-v]

dir is a positional argument which is defined like this:

parser.add_argument('dir', default=os.getcwd())

I want the dir to be optional: when it's not specified it should just be cwd .

Unfortunately when I don't specify the dir argument, I get Error: Too few arguments .


Use nargs='?' (or nargs='*' if you will need more than one dir)

parser.add_argument('dir', nargs='?', default=os.getcwd())

extended example:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v

As an extension to @VinaySajip answer. There are additional nargs worth mentioning.

  • parser.add_argument('dir', nargs=1, default=os.getcwd())
  • N (an integer). N arguments from the command line will be gathered together into a list

  • parser.add_argument('dir', nargs='*', default=os.getcwd())
  • '*'. All command-line arguments present are gathered into a list. Note that it generally doesn't make much sense to have more than one positional argument with nargs='*' , but multiple optional arguments with nargs='*' is possible.

  • parser.add_argument('dir', nargs='+', default=os.getcwd())
  • '+'. Just like '*', all command-line args present are gathered into a list. Additionally, an error message will be generated if there wasn't at least one command-line argument present.

  • parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())
  • argparse.REMAINDER . All the remaining command-line arguments are gathered into a list. This is commonly useful for command line utilities that dispatch to other command line utilities

    If the nargs keyword argument is not provided, the number of arguments consumed is determined by the action. Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.


    parser.add_argument also has a switch required . You can use required=False . Here is a sample snippet with Python 2.7:

    parser = argparse.ArgumentParser(description='get dir')
    parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
    args = parser.parse_args()
    
    链接地址: http://www.djcxy.com/p/4880.html

    上一篇: 获取装饰类方法的类名

    下一篇: Argparse可选的位置参数?