2016-10-04 53 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=...的說明書。

相關問題