2013-09-30 93 views
1

我搜索并尝试下面的东西,但无法找到任何解决办法使用argparse从我的模块通过它的命令行参数的另一个模块,请让我知道这是可能的:呼叫与蟒蛇

我试图发展一个python模块作为包装器,我使用它的.main()调用另一个第三方模块,并提供我需要从模块中的命令行获取的必需参数。我的模块也需要一些参数。

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

我想在我的模块中提供所有参数,而无需在add_argument中声明。我试着用parse_known_args这也需要声明所有参数是必需的。

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

由于提前,

回答

0

只要您调用第三方的模块,一个可能的解决方案是 变化sys.argv中并在运行时sys.argc以反映 了正确的参数一旦你完成了你自己的参数,你要调用的模块。

+0

记得做此之前进口包裹模块。 –

+0

我也试过,在我的情况下,第三方模块的参数也从我的模块命令行中获取。意味着如果第三方模块接受'a','b','c'参数,我将从我的模块的命令行中获取这些值以及我所需的参数。 – Chetan

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) 

替代甲

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认识的东西。

+0

hpaulj,我不想将A的论点再次定义为它的巨大列表,我希望它能够在A(第三方模块)中作为它的定义工作。 – Chetan

3

感谢hpaulj,mguijarr和Mike,

我能够与所有上述投入来解决问题,比如以下:

我的模块:

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() 
+0

太棒了!然后,您可以提高我们的答案;) – mguijarr