См. здесь для обсуждения достоинств различных опций и вариантов синтаксического анализа аргументов, имеющихся в Python.
Я делаю сценарий сравнения, который делает аккуратные вещи с выходными данными Python difflib
, и часть того, что это включает, - это обработка различных способов его вызова. Например, Git отправит 7 аргументов (второй и пятый - это файлы, которые вы хотите сравнить) в программу сравнения, с помощью которой вы ее настраиваете, и ожидается, что большинство разных аргументов также будут принимать входные данные как два аргумента файла. Интересно, что флаг difftool
--extcmd=
git вызывает различие, которое вы указываете только с двумя аргументами.
Так что использовать OptionParser для этого очень просто, поскольку он просто дает вам список аргументов, и я мог бы взять второй и пятый и отправить их fileinput
.
Я заметил большой баннер на pydoc, в котором говорится, что он устарел, поэтому я посмотрел на argparse
.
Мне было вообще непонятно, можно ли настроить argparse
, чтобы ваша программа принимала серию позиционных аргументов без опции "запускать ее". Это то, что мне было нужно, так как я не могу изменить способ, например. Git вызовет разницу.
Как бы то ни было, я закончил тем, что проделал несколько действительно тривиальных манипуляций с sys.argv
, что, в конце концов, я должен был делать в данной конкретной ситуации.
if len(sys.argv) == 8:
# assume this was passed to git; we can of course do
# some parsing to check if we got valid git style args
args = [sys.argv[2], sys.argv[5]]
elif len(sys.argv) == 3:
args = sys.argv[:1]
else:
sys.exit("Not a valid number of args (2 or 7) to this diff program")
print "Files: " + ' '.join(args)
Как можно использовать argparse для реализации программы, которая просто пытается открыть и прочитать все свои аргументы?
Причина в том, что для того, чтобы argparse
устарел parseopt
, должна быть возможность воспроизвести всю его функциональность (в разумных пределах).
sys.argv
. Тогда, возможно, мы могли бы предложить, как сделать то же самое сargparse
. - person unutbu   schedule 13.06.2013