2014-09-11 1 views
0

Пользователь должен иметь возможность вызывать сценарий Python вроде этого:Как читать несколько параметров командной строки с одним и тем же флагом в Python?

python myScript.py -i inputFile.txt -k string1 -k string2 -k string3 -o outputFile.txt 

или как это:

python myScript.py -i inputFile.txt -o outputFile.txt -k string1 -k string2 

Внутри сценария, я хочу закончить чтение в параметре «-i» , параметр «-o» и поместить все «-k» параметры (переменная сумма) в упорядоченный список.

Я хочу сделать это чистым способом (я знаю, что могу написать это сам с нуля, но я бы предпочел использовать уже построенную библиотеку/модуль).

Я должен использовать Python 2.4.3 и хотел бы использовать getopt (если не что-то подобное). Я также не могу загрузить argparse.

+2

Python 2.4.3! Это требование. , , Хотя 'argparse' был добавлен в python2.7, он работает с предыдущими версиями (хотя я понятия не имею, как далеко назад - 2.4 может быть слишком примитивным, но вы всегда можете хотя бы дать ему шанс ...) – mgilson

+1

'argparse' является новым в 2.7, но' optparse' полностью возвращается к 2.3, и он намного ближе к 'argparse', чем' getopt'. Единственная причина использовать 'getopt' - это то, что вы уже хорошо знаете' getopt' и не имеете причины изучать что-то новое (но уже устаревшее) как 'optparse'. – abarnert

+3

@mgilson прав (как обычно). ['argparse'] (https://pypi.python.org/pypi/argparse) в PyPI работает на 2.3+. – abarnert

ответ

1

Учитывая ограничения на мой вопрос (Python 2.4.3, без установки argparse), я сделал его работу следующим образом:

from optparse import OptionParser 

parser = OptionParser() 
parser.add_option('-f', action='append') 
parser.add_option('-i', action='store') 
parser.add_option('-o', action='store') 
(options, args) = parser.parse_args() 
print options 
print args 

Учитывая это Командная строка:

python test_argparse.py -f hi -f bye -i input1 -i input2 -o output1 -o output2 

я получил:

{'i': 'input2', 'o': 'output2', 'f': ['hi', 'bye']} 
[] 
0

Предполагая, что вы можете установить argparse, единственным сложным требованием, которое у вас есть, является возможность указать аргумент несколько раз. argparse обрабатывает это безупречно с его "append" действие:

>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-k', action='append') 
_AppendAction(option_strings=['-k'], dest='k', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None) 
>>> parser.parse_args(['-k', 'foo', '-k', 'bar']) 
Namespace(k=['foo', 'bar']) 
+0

Установка argparse не является жизнеспособным вариантом. Я рассматриваю optparse, чтобы увидеть, есть ли у него такое действие. – user1145925