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

2024-09-29 23:17:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在同一个包中有两个模块,module1.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()并使用它(这是可行的):

^{pr2}$

使用:

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

输出:

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

问题是:如何读取module2.pyrequired和/或{})中的参数,而不是{}的参数?(例如,main中的args包含更多参数,仅用于module2.py


Tags: pyaddparser参数requiredargparsehelpargs
1条回答
网友
1楼 · 发布于 2024-09-29 23:17:08

您需要使用partial parsing^{}来实现您想要的结果,和/或显式地将参数作为列表传递。在

通常,不带参数的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中的解析器:

^{pr2}$

相关问题 更多 >

    热门问题