【发布时间】:2021-09-04 00:36:52
【问题描述】:
基本上,我有一个程序接受一些可选/位置参数,但我想要一个可以单独使用的可选参数。我希望它的工作方式类似于“--version”选项的工作方式,如果给出该参数,则不需要位置参数并且代码运行。
我制作了几个测试文件来说明我的意思:
import argparse
import os,sys
def main():
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--print-line", type=str, metavar="file", help="print the first line of a file")
parser.add_argument("num", type=int, help="an important number")
args = parser.parse_args()
if args.print_line is not None:
if not os.path.isfile(args.print_line):
parser.error("file:%s not found" % args.print_line)
with open(args.print_line, "r") as infile:
print("First line:\n%s" % infile.readline().rstrip())
return
print("Important number: %i" % args.num)
if __name__ == "__main__":
main()
帮助选项给出:
usage: notworks_goodhelp.py [-h] [--print-line file] num
positional arguments:
num an important number
optional arguments:
-h, --help show this help message and exit
--print-line file print the first line of a file (default: None)
这是完美的!但是,如果我尝试使用可选参数,
$ python notworks_goodhelp.py --print-line file.txt
usage: notworks_goodhelp.py [-h] [--print-line file] num
notworks_goodhelp.py: error: too few arguments
它不起作用,因为它缺少位置参数。
我使用parse_known_args() 使脚本工作,但是帮助屏幕出错了!如下图:
import argparse
import os,sys
def main():
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--print-line", type=str, metavar="file", help="print the first line of a file")
args, leftovers = parser.parse_known_args()
if args.print_line is not None:
if not os.path.isfile(args.print_line):
parser.error("file:%s not found" % args.print_line)
with open(args.print_line, "r") as infile:
print("First line:\n%s" % infile.readline().rstrip())
return
parser.add_argument("num", type=int, help="an important number")
args = parser.parse_args(leftovers)
print("Important number: %i" % args.num)
if __name__ == "__main__":
main()
但帮助屏幕是:
usage: works_nohelp.py [-h] [--print-line file]
optional arguments:
-h, --help show this help message and exit
--print-line file print the first line of a file (default: None)
缺少 'num' 位置参数!
有人知道解决这个问题的方法吗?
【问题讨论】:
-
--version有效,因为它绑定到version操作,该操作立即输出版本并退出脚本,而不是等到所有选项都被解析后。您可以对--print_line执行相同的操作:定义argparse.Action的自定义子类,在解析选项时执行您想要的操作,而不是等到解析完所有 选项。 -
第一个
parse_args或parse_known_args看到help(或版本)并行动。 -
啊,我明白了。我要试试
argparse.Action方法。