【问题标题】:how to add multiple argument options in python using argparse?如何使用 argparse 在 python 中添加多个参数选项?
【发布时间】:2017-11-28 11:01:47
【问题描述】:

我的要求:

现在当我使用这个命令运行我的 python 应用程序时

python main.py -d listhere/users.txt

程序将运行并将结果文件保存为预定义的名称,例如 reports.txt

现在我想添加此功能,以允许用户选择放置文件名的内容以及保存位置

python main.py -d -o output/newfilname -i listhere/users.txt

一切都是一样的,但我希望传递另一个参数 -o 来确定要保存的文件路径和名称。我该怎么做。处理或组合多个选项的最佳方式是什么。

我试过了

    parser = argparse.ArgumentParser(description = "CHECK-ACCESS REPORTING.")
    parser.add_argument('--user','-d', nargs='?')
    parser.add_argument('--output','-d -o', nargs='?')
    parser.add_argument('--input','-i', nargs='?')
    args = parser.parse_args(sys.argv[1:])

   if args.output and args.input:
        #operation that involves output filename too
   elif args.user and not args.input:
       #default operation only
   else:
      #notset

我在尝试以这种方式解决问题时遇到此错误

错误:

report.py:错误:无法识别的参数:-o listhere/users.txt

【问题讨论】:

  • 您不能将更多 - 选项附加到另一个 - 选项,不,-d -o 在此处不是有效的选项名称。为什么不只使用-o 选项来指定输出名称?
  • 去掉 -d 就可以了
  • 我这样做的原因是,如果我在 -d 之后不传递一些值,它将无法工作。如何使 -d 仅作为没有值的参数。尝试将 default='' 附加到 -d 但不起作用
  • 如果我用这个参数打印 arg 的值,我什么也得不到python report.py -d -o listhere/users.txt -i list/here.txt
  • 旧的-d users.txt和新的-i users.txt有什么区别?选项-d的目的是什么?

标签: python arguments command-line-arguments argparse


【解决方案1】:

nargs='?' 标记选项以 3 种方式工作

parser.add_argument('-d', nargs='?', default='DEF', const='CONST')

命令行:

foo.py -d value # => args.d == 'value'
foo.py -d       # => args.d == 'CONST'
foo.py          # => args.d == 'DEF'

https://docs.python.org/3/library/argparse.html#const

利用这一点,您不应该需要像这样错误的-d -o 标志。

如果不使用const参数,就不要使用'?'

parser.add_argument('--user','-u', nargs='?', const='CONST', default='default_user')
parser.add_argument('--output','-o', default='default_outfile')
parser.add_argument('--input','-i', default='default_infile')

【讨论】:

  • 谢谢,描述性很强我对默认值非常不清楚,const
  • 另一个想法:-d -obash 分成2 个字符串;有时查看sys.argv 以了解argparse 必须处理的内容会有所帮助。
  • 你能考虑一下吗python testing.py -d -i somevalue -o somevalue我不想在-d之后传递值导致不满足条件if args.users: if args.input and args.output
  • 好的,通过设置 const="some value"
【解决方案2】:

你想要这样的东西吗:

import argparse

def main():
    parser = argparse.ArgumentParser(
        description='Check-Access Reporting.',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    )
    parser.add_argument(
        '-d',
        dest='discrepancy',
        action='store_true',
        help='Generate discrepancy report.',
    )
    parser.add_argument(
        '--input',
        '-i',
        default='users.txt',
        help='Input file for the report.',
    )
    parser.add_argument(
        '--output',
        '-o',
        default='reports.txt',
        help='Output file for the report.',
    )
    args = parser.parse_args()

    if args.discrepancy:
        print('Report type: {}'.format(args.report_type))
        print('Input file: {}'.format(args.input))
        print('Output file: {}'.format(args.output))
    else:
        print('Report type is not specified.')

if __name__ == '__main__':
    main()

选项--help的结果:

usage: ptest_047.py [-h] [-d] [--input INPUT] [--output OUTPUT]

Check-Access Reporting.

optional arguments:
  -h, --help            show this help message and exit
  -d                    generate discrepancy report (default: False)
  --input INPUT, -i INPUT
                        input file for the report (default: users.txt)
  --output OUTPUT, -o OUTPUT
                        output file for the report (default: reports.txt)

没有任何选项(或缺少选项-d):

Report type is not specified.

带有选项-d

Report type: discrepancy
Input file: users.txt
Output file: reports.txt

-d --input input.txt --output output.txt:

Report type: discrepancy
Input file: input.txt
Output file: output.txt

【讨论】:

  • 问题是你必须在-d标志之后传递一些值我只想传递标志-d而不给它任何值
  • @TaraPrasadGurung 选项的顺序无关紧要,例如:-o output.txt -i input.txt -d。选项 -d 在命令行上没有任何值。如果在命令行的某处使用了该选项,则它将变量 discrepancy 设置为 true。
猜你喜欢
  • 2018-03-04
  • 2018-09-17
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 2011-11-21
  • 2016-06-21
  • 1970-01-01
相关资源
最近更新 更多