2016-11-02 2 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

Я бы предложил прочитать о модуле [argparse] (https://docs.python.org/2/howto/argparse.html) Python, который, как правило, легче работать, чем 'getopt'. – larsks

ответ

1

Try используя @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.
  • required делает этот аргумент является обязательным, поэтому вы должны добавить по крайней мере один элемент

С помощью argparse модуля вы также получили опцию -h, чтобы описать свои Params. Так попробуйте использовать:

$ 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

Спасибо, что сработали. Один вопрос, однако, почему он показывает даже нужные параметры под «необязательными аргументами при запросе -h» –

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'] 

Примечание у меня есть прокомментировал ваш вызов функции и удалил разворачивать свой код из основной функции, вы можете переделать эти вещи в свой код, это не изменит ваш результат.

+0

Спасибо, я думаю, это будет сложно при использовании всех файлов в каталоге для ввода. –

+1

Ну да, у getopt есть свои ограничения, а argparse определенно лучше :) –

Смежные вопросы