2016-09-08 2 views
3

は、私は、モジュールmyscript.pyがあるとします。このモジュールはプロダクションコードであり、よく%dir%>python myscript.py foo barと呼ばれます。Python:コマンドラインからの呼び出し時にkwargsの使用を有効にする方法はありますか? (おそらくargparse付き)

私はキーワード引数を取るためにそれを拡張したいと思います。私は以下のスクリプトを使用して、これらの引数を取ることができることを知っているが、残念ながら1は

%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オブジェクトを生成します。あなたの__main__ブロックで

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) 

、あなたはmainNamespaceから生成辞書を渡し、その後、引数を解析します。

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 
関連する問題