如何解决使用 parse_known_args() 时,Python argparse 帮助选项不会显示所有参数
本质上,我有一个接受一些可选/位置参数的程序,但我想要一个可以单独使用的可选参数。我希望它的工作方式类似于“--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,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",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”位置参数!
有人知道如何解决这个问题吗?
解决方法
根据 chepner 的评论,我能够通过正确的操作和帮助屏幕使其在该程序中运行。谢谢!
import argparse
import os,sys
class ExitOnAction(argparse.Action):
def __init__(self,option_strings,dest,nargs=None,**kwargs):
if nargs != 1 and nargs is not None:
print("nargs: " + str(nargs))
raise ValueError("nargs must be 1")
super(ExitOnAction,self).__init__(option_strings,**kwargs)
def __call__(self,parser,namespace,values,option_string=None):
setattr(namespace,self.dest,values)
if not os.path.isfile(values):
parser.error("file:%s not found" % values)
with open(values,"r") as infile:
print("First line:\n%s" % infile.readline().rstrip())
sys.exit()
def main():
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--print-line",action=ExitOnAction,type=str,metavar="file",help="print the first line of a file")
parser.add_argument("num",type=int,help="an important number")
print("Parsing args")
args = parser.parse_args()
print("Parsed 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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。