2017-11-03 3 views
0

私は以下のpythonプログラムをコマンドラインから引数を取る必要があります。Pythonはコマンドライン引数with-in program

import argparse 
import sys 

choice=['orange','apple', 'grapes', 'banna'] 

def select(): 
    parser = argparse.ArgumentParser(prog='one', description='name test') 
    parser.add_argument(
     'fname', 
     action="store", 
     type=str, 
     choices=choice, 
     help="furits name") 

    args = parser.parse_args(sys.argv[1:2]) 

    print 'selected name {0}\n'.format(args.fname) 

if __name__ == '__main__': 
    select() 

これはと-のmain関数の引数をインライン化するにはどうすればよい

python s.py apple 
selected name apple 

に動作します。私はこれを試みたが、それは動作しません。

変更メインラインthis。

if __name__ == '__main__': 
    sys.argv[0]='apple' 
    select() 

下記のエラーが発生します。

usage: one [-h] {orange,apple,grapes,banna} 
one: error: too few arguments 

どのように私は、引数でこれを達成することができますか? -SR

+0

'parse_args'のデフォルトの動作は、' sys.argv [1:] 'を使うことです。 'sys.argv [0]'はデフォルトの 'prog'属性として使われます。 – hpaulj

答えて

1

あなたのインデックス

おかげでsys.argv[0]は、Pythonスクリプトのパスになります間違っています。あなたが望むものは次のとおりです:

if __name__ == '__main__': 
    if len(sys.argv) == 1: 
     sys.argv.append("apple") 
    select() 

しかし、これは奇妙なやり方です。もう少し考えた後、これは私に発生しました:

choice=['orange','apple', 'grapes', 'banna'] 

def select(): 
    parser = argparse.ArgumentParser(prog='one', description='name test') 
    parser.add_argument(
     'fname', 
     nargs='?', 
     default='apple', 
     action="store", 
     type=str, 
     choices=choice, 
     help="furits name") 

    args = parser.parse_args(sys.argv[1:2]) 

    print 'selected name {0}\n'.format(args.fname) 

if __name__ == '__main__': 
    select() 

)(add_argumentの呼び出しにnargs='?'default='apple'追加を注意してください。これらはパラメータをオプションにし、引数が与えられていなければデフォルト値を "apple"に設定します。

+0

@BogdanMargineanあなたは正しいです、私のテストは貧弱で、修正されました。 –

+0

それは期待どおりに仕事をしています。 – sfgroups

+0

@sfgroups問題ありません –

関連する問題