Python:除了来自外部函数的参数之外,还使用 ​​argparse 读取命令行参数

标签 python argparse

我在同一个包中有两个模块,module1.pymodule2.py

module1.py中,我有一个使用argparse读取命令行参数的函数:

import argparse

def parse_arguments_module1():
    parser = argparse.ArgumentParser()
    optional = parser._action_groups.pop()
    required = parser.add_argument_group('required arguments')
    required.add_argument('--argA', help='argA', required=True)
    required.add_argument('--argB', help='argB', required=True)
    optional.add_argument('--argC', help='argC')
    optional.add_argument('--argD', help='argD')
    parser._action_groups.append(optional)
    args = parser.parse_args()
    return args

现在假设在 module2.py 中,我从 module1.py 导入 parse_arguments_module1() 并使用它(这有效):

from module1 import parse_arguments_module1

if __name__ == '__main__':
    args = parse_arguments_module1()
    print(args)

用途:

python3 module2.py --argA A --argB B --argC C

输出:

Namespace(argA='A', argB='B', argC='C', argD=None)

问题是:如何读取module2.py中的参数(必需和/或可选)附加module1.py 的那些? (即在 main 中让 args 包含更多参数,仅用于 module2.py)

最佳答案

您需要使用partial parsing parser.parse_known_args() 来实现你想要的,和/或明确地将你的参数作为列表传递。

通常,不带参数parser.parse_args()获取 sys.argv[1:] 中的所有值(所以除了第一个元素之外的所有元素)作为要解析的输入。如果该列表中存在无法解析的元素,则会打印一条错误消息并 sys.exit(1)叫做;您的脚本将退出。

所以,如果您想要 sys.argv 上的一些参数要转到一个解析器,并将其余部分转到另一个解析器,您需要使用 parser.parse_known_args()并将余数传递给另一个解析器。

我会分开创建和配置 ArgumentParser()来自解析的实例;所以在 module1做:

def module1_argument_parser():
    parser = argparse.ArgumentParser()
    optional = parser._action_groups.pop()
    required = parser.add_argument_group('required arguments')
    required.add_argument('--argA', help='argA', required=True)
    required.add_argument('--argB', help='argB', required=True)
    optional.add_argument('--argC', help='argC')
    optional.add_argument('--argD', help='argD')
    parser._action_groups.append(optional)
    return parser

def parse_arguments_module1(args=None):
    parser = module1_argument_parser()
    return parser.parse_args(args)

if __name__ == '__main__':
    args = parse_arguments_module1()
    print(args)

以及module2 ,使用相同的结构,但重新使用 module1 中的解析器:

from module1 import module1_argument_parser

def module2_argument_parser():
    parser = argparse.ArgumentParser()
    # create argument switches, etc.
    return parser

def parse_arguments_module2(args=None):
    parser = module2_argument_parser()
    return parser.parse_args(args)

if __name__ == '__main__':
    module1_parser = module1_argument_parser()
    module1_args, remainder = module1_parser.parse_known_args()
    module2_args = parse_arguments_module2(remainder)
    print(module1_args)
    print(module2_args)

关于Python:除了来自外部函数的参数之外,还使用 ​​argparse 读取命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52929014/

相关文章:

python - 我可以关闭 Azure DevOps 管道中的并行作业吗?

python - 在 Linux 上安装 Anaconda 的问题

"condense"矩阵的 Pythonic 方式

python - 如何处理启用 telegram bot 的错误?

python - 具有单一分类特征的 LSTM 预测

python - 带有方括号的 metavar 的 argparse AssertionError

Python 参数解析 : Insert blank line between help entries

python : extract parameters created with argparse

python - argparse 何时停止显示无参数的 'short help' ?

Python argparse,运行一个或多个子命令