我在同一个包中有两个模块,module1.py
和 module2.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/