2016-09-08 42 views
3

假設我有模塊myscript.py;該模塊是生產代碼,通常稱爲%dir%>python myscript.py foo barPython:如何在從命令行調用時使用kwargs? (也許與argparse)

我想擴展它以獲取關鍵字參數。我知道我可以使用下面的腳本,但不幸的是我們可以用

%dir%>python myscript.py main(foo, bar)來稱呼它。

我知道我可以使用​​模塊,但我不知道該怎麼做。

import sys 

def main(foo,bar,**kwargs): 
    print 'Called myscript with:' 
     print 'foo = %s' % foo 
     print 'bar = %s' % bar 
     if kwargs: 
      for k in kwargs.keys(): 
       print 'keyword argument : %s' % k + ' = ' + '%s' % kwargs[k] 

if __name__=="__main__": 
    exec(''.join(sys.argv[1:])) 
+0

您已經似乎已經提供瞭解決方案,但要我們寫程序爲你。如果你先去[文檔](https://docs.python.org/3/library/argparse.html),嘗試一些東西,當你試圖使用'argparse'的時候再次發佈。 – Ian

+0

我不認爲需要'argparse',我很快就會提出一個答案。 –

+0

'argparse'不需要*,但它使得使用可選參數調用腳本更容易。 – chepner

回答

2

如果你想在關鍵字參數傳遞,你會在主函數中,key=value,你可以像這樣:

import sys 

def main(foo, bar, *args): 
    print "Called my script with" 

    print "foo = %s" % foo 
    print "bar = %s" % bar 

    for arg in args: 
     k = arg.split("=")[0] 
     v = arg.split("=")[1] 

     print "Keyword argument: %s = %s" % (k, v) 


if __name__ == "__main__": 
    if len(sys.argv) < 3: 
     raise SyntaxError("Insufficient arguments.") 
    if len(sys.argv) != 3: 
     # If there are keyword arguments 
     main(sys.argv[1], sys.argv[2], *sys.argv[3:]) 
    else: 
     # If there are no keyword arguments 
     main(sys.argv[1], sys.argv[2]) 

一些例子:

$> python my_file.py a b x=4 
Called my script with 
foo = a 
bar = b 
Keyword argument: x = 4 
$> python my_file.py foo bar key=value 
Called my script with 
foo = foo 
bar = bar 
Keyword argument: key = value 

然而,這種假設密鑰和值之間沒有任何空格,key = value將不起作用。

如果您正在尋找--argument種關鍵字參數,請您應該使用​​。

0

首先,您不會傳遞任意的Python表達式作爲參數。這是脆弱和不安全的。

要設置參數解析器,您可以定義所需的參數,然後解析它們以生成包含由命令行調用指定的信息的Namespace對象。

import argparse 
p = argparse.ArgumentParser() 
p.add_argument('foo') 
p.add_argument('bar') 
p.add_argument('--add-feature-a', dest='a', action='store_true', default=False) 

在你__main__塊,您解析參數,然後通過從Namespace產生的main字典。

if __name__ == '__main__': 
    args = p.parse_args() 
    main(**vars(args)) 

然後你會喜歡

# foo = "3", bar = "6", a = True 
python myscript.py 3 6 --add-feature-a 

# foo = "moo", bar="7.7", a = False 
python myscript.py moo 7.7 

線有很多打電話給你的腳本更可以用​​做,但是這是一個簡單的例子將它產生的價值轉化爲main

4

@Moon打我給它一個類似的解決方案,但我建議你事先做了分析,並通過實際kwargs

import sys 

def main(foo, bar, **kwargs): 
    print('Called myscript with:') 
    print('foo = {}'.format(foo)) 
    print('bar = {}'.format(bar)) 
    for k, v in kwargs.items(): 
     print('keyword argument: {} = {}'.format(k, v)) 

if __name__=='__main__': 
    main(sys.argv[1], # foo 
     sys.argv[2], # bar 
     **dict(arg.split('=') for arg in sys.argv[3:])) # kwargs 

# Example use: 
# $ python myscript.py foo bar hello=world 'with spaces'='a value' 
# Called myscript with: 
# foo = foo 
# bar = bar 
# keyword argument: hello = world 
# keyword argument: with spaces = a value