如何从主脚本修改Python子模块的argparse?

时间:2019-12-05 02:34:36

标签: python arguments

我编写了一个自定义子模块,以在相似的API项目中重用相同的代码。

在我的子模块中,我具有以下内容:

# sub.py
from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument("-s", "--silent", help="silent mode", action="store_true")
script_args = arg_parser.parse_args()

if not script_args.silent:
    # If the silent flag isn't passed then add logging.
    #logger.addHandler(console_handler)

在主脚本中通过add_argument()添加其他参数的最佳方法是什么?

# main.py
import sub

# This still works:
if sub.script_args.silent:
    # Some code

# I tried this, but it doesn't work:
sub.arg_parser.add_argument("-t", "--test", help="test mode", action="store_true")
sub.script_args.parse_args()
# The script doesn't know about -t.

1 个答案:

答案 0 :(得分:1)

您可以使用 parse_known_args 函数(partial parsing)。

例如:

# sub.py
from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument("-s", "--silent", help="silent mode", action="store_true")
partial_script_args = arg_parser.parse_known_args()[0]

print("silent") if partial_script_args.silent else print("not silent")
# main.py
import sub

# This still works:
if sub.partial_script_args.silent:
    pass

sub.arg_parser.add_argument("-t", "--test", help="test mode", action="store_true")
full_script_args = sub.arg_parser.parse_args()

print("test") if full_script_args.test else print("not test")

请注意文档中的警告:

  

警告: Prefix matching规则适用于parse_known_args()。解析器可能会消耗一个选项,即使它只是其已知选项之一的前缀,而不是将其保留在其余参数列表中。