2

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

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

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

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

有什么方法可以将所有参数传递给调用模块而不在我的模块中声明?如果可能的话,请让我知道如何做到这一点。

提前致谢,

4

3 回答 3

4

感谢 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()
于 2013-09-30T19:19:20.393 回答
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 处理所有事情,使用“父母”参数来“学习”B.parser 识别的内容。

于 2013-09-30T17:16:03.247 回答
0

如果您正在调用第三方模块,一个可能的解决方案是在运行时更改sys.argvsys.argc以反映您正在调用的模块的正确参数,一旦您完成了自己的参数。

于 2013-09-30T03:39:53.847 回答