2016-10-04 28 views
0

argparse参数我有我的包的setup.py指定为入口点main功能,使用​​包才能通过命令行参数(见discussion here):如何设置从python脚本

# file with main routine specified as entry point in setup.py 
import argparse 
def main(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('a', type=str, help='mandatory argument a') 
    args = parser.parse_args() 

理想的情况下,我想在包的测试中使用与0123'建议的相同main函数。在后一种情况下,我想从测试类中调用main函数,并在函数调用之前设置(一些)命令行参数(否则将由于缺少参数而失败)。

# file in the tests folder calling the above main function 
class TestConsole(TestCase): 
    def test_basic(self): 
     set_value_of_a() 
     main() 

这可能吗?

+0

为什么不把'kwargs'添加到'main',并且只有当它们是'None'时,才将它们设置为'parse_args'? –

+0

@William Fernandes非常好,谢谢! – XabiFermal

回答

2

argparse模块实际上是从特殊的变量,它(从ARG ument V厄克托短)称为ARGV读取输入变量。该变量通常通过读取sys.argvsys模块来访问。

这个变量是一个普通的列表,这样可以追加你的命令行参数,它是这样的:

import sys 
sys.argv.extend(['-a', SOME_VALUE]) 
main() 

然而,在运行时用sys.argv中搞乱不是测试的一个好办法。 一个更清洁更换sys.argv中一些有限范围的方法是使用unittest.mock.patch上下文管理器,像这样:

with unittest.mock.patch('sys.argv'. ['-a', SOME_VALUE]): 
    main() 

Read more about unittest.mock.patch in documentation

也,所以这个检查问题:

How do I set sys.argv so I can unit test it?

0

添加kwargsmain,如果它们是None,则将它们设置为parse_args

0

@William费尔南德斯:只是为了完整起见,我将在后,是由(检查一个空的字典没有kwargs is None)建议的方式,完整的解决方案:

def main(**kwargs): 
    a = None 
    if not kwargs: 
     parser = argparse.ArgumentParser() 
     parser.add_argument('a', type=str, help='mandatory argument a') 
     args = parser.parse_args() 
     a = args.a 
    else: 
     a = kwargs.get('a') 

    print(a) 

从测试中类main函数这时可以参数调用:

# file in the tests folder calling the above main function 
class TestConsole(TestCase): 
    def test_basic(self): 
     main(a=42) 

从而不kwargs命令行中的呼叫,则需要在命令行参数a=...的说明书。

相关问题