argparse:可选参数作为标志和变量

时间:2016-05-28 22:00:17

标签: python argparse

我正在编写一个带有两个参数(路径)的程序,作为一个选项-l,可以将日志保存在日志文件中。

我正在使用argparse并创建以下参数:

parser.add_argument('-l', '--logfile', 
                    nargs='?', 
                    const='tranfer.log', 
                    default=False,
                    help='save log of the transfer')

这些是使用形式:

  1. prog.py path_1 path_2。没什么特别的。
  2. prog.py -l filename path_1 path_2。将日志保存在filename文件中。
  3. prog.py -l path_1 path_2。默认情况下将日志保存(例如,logfile)。
  4. 我在第3项中遇到问题,因为prog.pypath_1作为日志文件的文件名。该问题很容易修复puttin -l选项在行尾。

    prog.py path_1 path_2 -l

    但我想知道是否有一种方法告诉argparse使用最后两个选项作为路径文件,因为我不是唯一一个使用该程序的人。

    路径参数添加如下:

    parser.add_argument('left_path', 
                        action='store',
                        help='first path')
    parser.add_argument('right_path', 
                        action='store',
                        help='second path')
    

3 个答案:

答案 0 :(得分:2)

您的评估是对的,

prog.py -l path_1 path_2

会将path_1分配给lpath_2到第一个位置,并引发有关错过第二个位置的错误。

http://bugs.python.org/issue9338 argparse optionals with nargs='?', '*' or '+' can't be followed by positionals是一个处理此问题的错误/问题。已经提出了补丁,但没有实现。这不是微不足道的。在处理-l时,解析器必须向前看,以查看满足位置所需的参数数量,并避免使用下一个字符串(即使按照您的定义,它也有权这样做)。

以前的SO问题也讨论了它。

https://stackoverflow.com/a/29853186/901925

https://stackoverflow.com/a/26986546/901925

你必须要么选择最后一个,要么使用其他一些方法来表示其参数列表的结尾(--或其他标记的可选项)。或者更改参数定义,以使-l不是?(或等效的),或将位置更改为标记。

答案 1 :(得分:0)

这样做的巧妙方法是为路径参数引入选项标志。然后就没有歧义,你可以说:

prog.py -l -leftpath path_1 -rightpath path_2

答案 2 :(得分:0)

您还可以将所有选项存储在一个参数中并手动检查,如

parser.add_argument('-p', dest='path', nargs='?',
                    default=('path1/','path2/'))
args = parser.parse_args()
if len(args.path) == 3:
   args.logfile = args.path[0]
   args.path = args.path[1:]
elif len(args.path) == 2:
   args.logfile = ''
else:
   print 'Error'

但如果要将路径设置为与默认值不同,则必须使用-p标记。