我搜索并尝试了以下内容,但未找到任何解决方案,如果可能,请告诉我:
我正在尝试开发一个python模块作为包装器,我用其.main()调用另一个第三方模块,并提供我需要从模块中的命令行获取的必需参数。我的模块也需要很少的参数。
我正在使用argparse来解析调用模块和模块的命令行。调用参数列表很大(超过40个)是可选的,但可能需要随时使用我的模块。目前我已经在我的模块中声明了很少的重要参数来解析,但我需要扩展所有参数。
我想在我的模块中提供所有参数而不在add_argument中声明。我尝试使用parse_known_args,这也需要声明所有参数。
有什么方法可以将所有参数传递给调用模块而不在我的模块中声明?如果有可能请告诉我如何做到。
提前致谢,
答案 0 :(得分:3)
感谢hpaulj,mguijarr和迈克,
我能够解决所有上述输入的问题,如下所示:
我的模块:
import sys
import argparse
parser = argparse.ArgumentParser(description='something')
parser.add_argument('--my_env', help='my environment')
if __name__=='__main__':
args,rest = parser.parse_known_args()
rest_arg = ['calling_module.py']
rest_arg.extend(rest)
sys.argv = rest_arg
import calling_module
calling_module.main()
答案 1 :(得分:2)
这种情况适合吗?
模块B:
import argparse
parser = argparse....
def main(args):
....
if __name__ == '__main__':
args = parser.parse_args()
main(args)
模块A
import argparse
import B
parser = argparse....
# define arguments that A needs to use
if _name__=='__main__':
args,rest = parser.parse_known_args()
# use args
# rest - argument strings that A could not process
argsB = B.parse_args(rest)
# 'rest' does not have the strings that A used;
# but could also use
# argsB = B.parse_known_args() # using sys.argv; ignore what it does not recognize
# or even
# argsB = B.parse_known_args(rest)
B.main(argsB)
替代A
import argparse
import B
parser = argparse.ArgumentParser(parents=[B.parser], add_help=False)
# B.parser probably already defines -h
# add arguments that A needs to use
if _name__=='__main__':
args = parser.parse_args()
# use args that A needs
B.main(args)
在一种情况下,每个解析器只处理它识别的字符串。在另一个A.parser中处理所有内容,使用'parents'参数来'学习'B.parser识别的内容。
答案 2 :(得分:0)
如果您正在呼叫第三方模块,可能的解决方案是 在运行时更改 sys.argv 和 sys.argc 以反映正确的参数 一旦你完成了自己的参数,你正在调用的模块。