【发布时间】:2016-09-05 23:19:51
【问题描述】:
我正在尝试让我的脚本正常工作,但 argparse 不断从父解析器覆盖我的位置参数。我怎样才能让 argparse 尊重父母对这些的价值?它确实保留了可选参数中的值。
这是我需要的一个非常简化的版本。如果你运行这个,你会看到 args 被覆盖了。
testargs.py
#! /usr/bin/env python3
import argparse
import sys
def main():
preparser = argparse.ArgumentParser(add_help=False)
preparser.add_argument('first',
nargs='?')
preparser.add_argument('outfile',
nargs='?',
type=argparse.FileType('w', encoding='utf-8'),
default=sys.stdout,
help='Output file')
preparser.add_argument(
'--do-something','-d',
action='store_true')
# Parse args with preparser, and find config file
args, remaining_argv = preparser.parse_known_args()
print(args)
parser = argparse.ArgumentParser(
parents=[preparser],
description=__doc__)
parser.add_argument(
'--clear-screen', '-c',
action='store_true')
args = parser.parse_args(args=remaining_argv,namespace=args )
print(args)
if __name__ == '__main__':
main()
并使用testargs.py something /tmp/test.txt -d -c 调用它
您会看到它保留了-d,但同时删除了位置参数并将它们恢复为默认值。
编辑:请参阅已接受答案中的其他 cmets 以了解一些注意事项。
【问题讨论】:
-
为什么不能一次解析所有参数?为什么首先需要预解析器?
-
只用
parser.parse_args()再次解析原始选项会起作用,不是吗? -
重新运行
parser.parse_args()什么都不做。 -
我的意思是用简单的
args = parser.parse_args()替换args = parser.parse_args(args=remaining_argv, namespace=args),以便它重新解析已经计算出来的参数。 -
我必须像这样设置它,因为在真正的脚本中,一些参数必须提前读取,然后我从默认值中提取设置,然后是基于早期参数的配置文件,然后最后一些选项被传入的参数覆盖。我只是试图让这个例子尽可能简单。
标签: python python-3.x argparse