2016-11-02 14 views
0

端末から入力として複数のファイルを取得しようとしています。入力番号は少なくとも1から多くに変わることがあります。ここに私のプログラムの入力がありますシェルから複数の引数を取るPythonスクリプト

F3.py -e <Energy cutoff> -i <inputfiles> 

パラメータ-iは、1からmultiple.e.gの任意の値を取るようにします。

F3.py -e <Energy cutoff> -i file1 file2 
F3.py -e <Energy cutoff> -i *.pdb 

今のところ、最初のファイルだけを取り出して停止します。 これは私が今までに持っているものです:

def main(argv): 
try: 
    opts,args=getopt.getopt(argv,"he:i:") 
    for opt,arg in opts: 
     if opt=="-h": 
      print 'F3.py -e <Energy cutoff> -i <inputfiles>' 
      sys.exit() 
     elif opt == "-e": 
      E_Cut=float(arg) 
      print 'minimum energy=',E_Cut 
     elif opt == "-i": 
      files.append(arg) 
      print files 
    funtction(files) 
except getopt.GetoptError: 
    print 'F3.py -e <Energy cutoff> -i <inputfiles>' 
    sys.exit(2) 

助けていただければ幸いです。おかげ

+4

私は、Pythonの[argparse](https://docs.python.org/2/howto/argparse.html)モジュールについて読むことをお勧めします。これは、一般に 'getopt'よりも扱いが簡単です。 – larsks

答えて

1

が@larsks提案を使用してみてください、次のスニペットは、あなたのユースケースのために働く必要があります。

import argparse 

parser = argparse.ArgumentParser() 

parser.add_argument('-i', '--input', help='Input values', nargs='+', required=True) 

args = parser.parse_args() 

print args 

kwargsから説明:

  • nargsあなたがリストとして値を解析することができますしたがって、for i in args.inputのようなものを使って繰り返すことができます。あなたはまた、あなたのparamsを記述するために-hオプションを得たargparseモジュールを使用することによって、少なくとも1つの要素

を追加する必要がありますので、

  • requiredは、この引数は必須になります。だから、使用してみてください:

    $ python P3.py -h 
    usage: a.py [-h] -i INPUT [INPUT ...] 
    
    optional arguments: 
        -h, --help   show this help message and exit 
        -i INPUT [INPUT ...], --input INPUT [INPUT ...] 
             Input values 
    
    
    $ python P3.py -i file1 file2 filen 
    Namespace(input=['file1', 'file2', 'filen']) 
    
  • +0

    ありがとうございました。しかし、1つの質問ですが、「オプションの引数が表示されたときに必要なオプションが表示されるのはなぜですか-0」 –

    1

    あなたがgetoptを使う、という場合は、,のようなスペース以外の区切り文字で複数の引数を組み合わせて、あなたはこれを実行すると、この

    import getopt 
    import sys 
    
    try: 
        opts,args=getopt.getopt(sys.argv[1:],"he:i:") 
        for opt,arg in opts: 
         if opt=="-h": 
          print 'F3.py -e <Energy cutoff> -i <inputfiles>' 
          sys.exit() 
         elif opt == "-e": 
          E_Cut=float(arg) 
          print 'minimum energy=',E_Cut 
         elif opt == "-i": 
          files = arg.split(",") 
          print files 
        #funtction(files) 
    except getopt.GetoptError: 
        print 'F3.py -e <Energy cutoff> -i <inputfiles>' 
        sys.exit(2) 
    

    のようにそれに応じてコードを変更する必要がありますあなたは、出力

    >main.py -e 20 -i file1,file2 
    minimum energy= 20.0 
    ['file1', 'file2'] 
    

    私が持っているNOTE を取得しますあなたの関数呼び出しをコメントし、メイン関数からコードをアンラップしたものを削除した場合、コード内でこれらのことをやり直すことができます。

    +0

    ありがとう、私は入力用のディレクトリにあるすべてのファイルを使用するとこれが難しいと思います。 –

    +1

    まあ、getoptには独自の制限があり、argparseは確かに良いです:) –

    関連する問題