我正在编写一个带有两个参数(路径)的程序,作为一个选项-l
,可以将日志保存在日志文件中。
我正在使用argparse
并创建以下参数:
parser.add_argument('-l', '--logfile',
nargs='?',
const='tranfer.log',
default=False,
help='save log of the transfer')
这些是使用形式:
prog.py path_1 path_2
。没什么特别的。prog.py -l filename path_1 path_2
。将日志保存在filename
文件中。prog.py -l path_1 path_2
。默认情况下将日志保存(例如,logfile
)。我在第3项中遇到问题,因为prog.py
将path_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')
答案 0 :(得分:2)
您的评估是对的,
prog.py -l path_1 path_2
会将path_1
分配给l
和path_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
标记。