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
)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
,而--
表示选项处理结束,而不更改当前解析器。您的问题回答了我的问题。谢谢:)是的,我必须将参数从“?”
更改为o1
。当bug被修复时,我会修改我的代码。谢谢