2017-02-13 8 views
0

私はコマンドラインから呼び出すPythonスクリプト内にユーザ定義関数を持っています。この機能には、3つの必須パラメータと3つのオプションパラメータがあります。可変数の必須引数とオプション引数をコマンドラインで渡す

だから関数定義は次のようになります。

def main(csv, inDir, batchID, mapprj=True, doP2D=True, rp=100): 

私はCLで関数を呼び出すときに、私がまたは後者の3つの入力変数を設定しない場合があります。今私が持っている、これらの入力を使用してこの関数を呼び出すには:

if __name__ == '__main__': 
    import sys 
    main(sys.argv[1], sys.argv[2], sys.argv[3]) 

をしかし、私はRP = 50を設定したいとし、その後、この呼び出しはその引数をミス。 しかし、私がsys.argv [6]に行くと、他の3つのオプションの引数を指定しなければ、これは失敗します。

これらの引数をmain関数に与えるためには、次のブロック以外にも良い方法がありますか? ALSO

if __name__ == '__main__': 
    import sys 

    if len(sys.argv) == 4: # i.e. 3 arguments are supplied 
     main(sys.argv[1], sys.argv[2], sys.argv[3]) 

    if len(sys.argv) == 5: # i.e. 4 arguments are supplied 
     main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) 

    if len(sys.argv) == 6: # i.e. 5 arguments are supplied 
     main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5]) 

    if len(sys.argv) == 7: # i.e. 6 arguments are supplied 
     main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6]) 

、私はこのようなコマンドラインから(上記のようなif文で)スクリプトを呼び出す場合:

私のメイン機能で「プリントRP」、それが戻っています
python script.py 'csvFile.csv' 'path/to/directory' 'batchName' False False rp=50 

rp = 50 '。私はrp = 100と設定すると、rpは省略可能な引数で、デフォルト値は100で、 "rp = 50"を明示的に呼び出すとデフォルト値を上書きし、 "rp = 50"ではなく "rp"

最後に、私はこのようなスクリプトを呼び出すとき:

python script.py 'csvFile.csv' 'path/to/directory' 'batchName' rp=50 

変数mapprjが「RP = 50」に設定取得され、doP2Dはデフォルト値どおりTrueで、そしてRPはデフォルト値を残っています上記の呼び出しは、mapprjとdoP2DをデフォルトのTrue値に保ち、明示的に50に設定してから50に設定したと考えました。

私は間違って何をしていますか?

おかげ

+1

何あなたは 'argparse'と呼ばれるモジュールを探しています – Nullman

答えて

1

必要なすべての位置引数を作り、argparseを介してコマンドラインからの引数を解析し、単にが解析された引数の辞書を解凍し、あなたの関数に渡し:

import argparse 


if __name__ == '__main__': 
    ap = argparse.ArgumentParser() 
    ap.add_argument("-c", "--csv", required=True, help = "filename") 
    ... 
    kwargs = vars(ap.parse_args()) 
    main(**kwargs) 
+0

ありがとう、Moses。私はこれをやってみました(-cを-incsvに置き換えてみました)が、TypeErrorを取得し続けています:main()は予期しないキーワード引数 'incsv'を持っています。 – user20408

+0

私はその周りを回ったが、今はデフォルトの値以外の何かオプションの引数を与えても、デフォルト値を上書きしない。したがって、私の引数の1つが次のように追加された場合: ap.add_argument( " - mapprj"、デフォルト= True、type = bool そして、3つの必須の値+ -mapprj = Falseまたは-mapprj – user20408

+0

これはmapprjとdoP2Dのブール値にのみ当てはまりますが、rpの設定は実際に動作しますが、デフォルトをFalseに設定してからCLでTrueに設定した場合はtrueになります。それはうまくいかないのですが、どうして私はこれを修正できますか?すべてのコメントが残念です – user20408

関連する問題