使用python中的argparse从我的模块传递其命令行参数来调用另一个模块

时间:2013-09-30 03:07:41

标签: python module wrapper argparse

我搜索并尝试了以下内容,但未找到任何解决方案,如果可能,请告诉我:

我正在尝试开发一个python模块作为包装器,我用其.main()调用另一个第三方模块,并提供我需要从模块中的命令行获取的必需参数。我的模块也需要很少的参数。

我正在使用argparse来解析调用模块和模块的命令行。调用参数列表很大(超过40个)是可选的,但可能需要随时使用我的模块。目前我已经在我的模块中声明了很少的重要参数来解析,但我需要扩展所有参数。

我想在我的模块中提供所有参数而不在add_argument中声明。我尝试使用parse_known_args,这也需要声明所有参数。

有什么方法可以将所有参数传递给调用模块而不在我的模块中声明?如果有可能请告诉我如何做到。

提前致谢,

3 个答案:

答案 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 以反映正确的参数 一旦你完成了自己的参数,你正在调用的模块。