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

Python argparse:作为标志和变量的可选参数,python,argparse,Python,Argparse,我正在编写一个程序,它接受两个参数(路径),并且作为选项-l,witch启用将日志保存到日志文件中 我正在使用argparse并创建以下参数: parser.add_argument('-l', '--logfile', nargs='?', const='tranfer.log', default=False, help='sav

我正在编写一个程序,它接受两个参数(路径),并且作为选项
-l
,witch启用将日志保存到日志文件中

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

parser.add_argument('-l', '--logfile', 
                    nargs='?', 
                    const='tranfer.log', 
                    default=False,
                    help='save log of the transfer')
以下是使用形式:

  • prog.py路径_1路径_2
    。没什么特别的
  • prog.py-l文件名路径_1路径_2
    。将日志保存到
    filename
    文件中
  • prog.py-l路径1路径2
    。默认情况下,将日志保存到文件中(例如,
    logfile
  • 我在第3项中遇到了一个问题,因为
    prog.py
    path_1
    作为日志文件的文件名。这个问题很容易就解决了,在行尾添加了
    -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')
    

    要做到这一点,最好的方法是为这两个PATH参数引入选项标志。这样就不会有歧义,你可以说:

    prog.py -l -leftpath path_1 -rightpath path_2
    

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

    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
    标志。

    您的评估是正确的

    prog.py -l path_1 path_2
    
    path_1
    分配给
    l
    path_2
    分配给第一个位置,并引发关于缺少第二个位置的错误

    argparse optionals的nargs='?'、'*'或'+'后面不能跟位置
    是一个处理此问题的bug/问题。已提出修补程序,但尚未实施。这不是小事。当处理
    -l
    时,解析器必须提前查看需要多少参数才能满足位置要求,并避免使用下一个字符串(即使根据您的定义,它完全有权这样做)

    在前面的SO问题中也讨论了这一点


    您必须将可选的放在最后,或者使用一些其他方式来表示其参数列表的结束(
    --
    或其他标记的可选)。或者更改参数定义,使
    -l
    不是
    (或等效项),或者将位置更改为标记。

    您可以使用
    prog.py-l--path_1 path_2
    ,而
    --
    表示选项处理结束,而不更改当前解析器。您的问题回答了我的问题。谢谢:)是的,我必须将参数从
    “?”
    更改为o
    1
    。当bug被修复时,我会修改我的代码。谢谢