Я хотел бы иметь программу, которая принимает --action=
флаг, где действительные выборы dump
и upload
, с upload
быть по умолчанию. Если (и только если) выбрано dump
, я бы хотел, чтобы там был также номер --dump-format=
. Есть ли способ выразить это с помощью argparse, или мне нужно просто принять все аргументы и самостоятельно выполнить логику.Условные аргументы командной строки в Python с использованием argparse
ответ
Вы можете использовать parser.error
:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--action', choices=['upload', 'dump'], default='dump')
parser.add_argument('--dump-format')
args = parser.parse_args()
if args.action != 'dump' and args.dump_format:
parser.error('--dump-format can only be set when --action=dump.')
Это только описание «аргументированного способа» сообщения об ошибке. Логика реализована вручную. Не является «аргументным» способом условно требующих аргументов. –
Если вместо «дампа» и «форматирования» есть еще 5 вариантов, у каждого из которых есть свой набор необходимых или необязательных аргументов, этот способ проверки необходимости может быстро стать неясным. –
Кроме того, такие вещи, как argparse.FileType, получат проблемы. Для некоторых выбранных действий, когда аргумент FileType не нужен, несуществование файла вызывает ложную ошибку. – Syncopated
Другим способом подойти к решению проблемы заключается в использовании subcommands (a'la мерзавца) с "действиями" в качестве первого аргумента:
script dump --dump-format="foo"
script upload
Спасибо, мне очень помогли! –
Это должен быть принятый ответ. – itsafire
argparse модуль предлагает способ сделать это, не выполняя собственные проверки безопасности . В приведенном ниже примере используются «подпарамеры» или «подкоманды». Я реализовал подпараметр для «дампа» и один для «формата».
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file', help='The file you want to act on.')
subparsers = parser.add_subparsers(dest='subcommand')
# subparser for dump
parser_dump = subparsers.add_parser('dump')
# add a required argument
parser_dump.add_argument(
'format',
choices=['csv', 'json'],
help='Dump the file in this format.')
# subparser for upload
parser_upload = subparsers.add_parser('upload')
# add a required argument
parser_upload.add_argument(
'server',
choices=['amazon', 'imgur'],
help='Upload the file to this service.')
args = parser.parse_args()
print args
if args.subcommand == 'dump':
print 'I will now dump "%s" in the %s format' % (args.file, args.format)
if args.subcommand == 'upload':
print 'I will now upload "%s" to %s' % (args.file, args.server)
Это выглядит следующим образом в командной строке:
$ python ap.py
usage: ap.py [-h] file {upload,dump} ...
ap.py: error: too few arguments
$ python ap.py tmp.txt
usage: ap.py [-h] file {upload,dump} ...
ap.py: error: too few arguments
$ python ap.py tmp.txt upload
usage: ap.py file upload [-h] {amazon,imgur}
ap.py file upload: error: too few arguments
$ python ap.py tmp.txt upload amazo
usage: ap.py file upload [-h] {amazon,imgur}
ap.py file upload: error: argument server: invalid choice: 'amazo' (choose from 'amazon', 'imgur')
$ python ap.py tmp.txt upload amazon
Namespace(file='tmp.txt', server='amazon', subcommand='upload')
I will now upload "tmp.txt" to amazon
$ python ap.py tmp.txt upload imgur
Namespace(file='tmp.txt', server='imgur', subcommand='upload')
I will now upload "tmp.txt" to imgur
$ python ap.py tmp.txt dump
usage: ap.py file dump [-h] {csv,json}
ap.py file dump: error: too few arguments
$ python ap.py tmp.txt dump csv
Namespace(file='tmp.txt', format='csv', subcommand='dump')
I will now dump "tmp.txt" in the csv format
$ python ap.py tmp.txt dump json
Namespace(file='tmp.txt', format='json', subcommand='dump')
I will now dump "tmp.txt" in the json format
Подробнее: http://docs.python.org/dev/library/argparse.html#argparse.ArgumentParser.add_subparsers
Это должен быть принятый ответ. – mbrandalero
- 1. Условные аргументы Python Argparse
- 2. Python argparse условные аргументы
- 3. Распечатать аргументы командной строки с помощью argparse?
- 4. Как разобрать эти аргументы командной строки в Python argparse?
- 5. Python argparse: «нераспознанные аргументы»
- 6. Параметр аргумента командной строки с использованием argparse
- 7. аргументы командной строки с использованием python
- 8. Python аргументы командной строки
- 9. python argparse с именем позиционные аргументы?
- 10. Итеративные аргументы командной строки в Python
- 11. Разбор аргументов командной строки с argparse
- 12. Аргументы командной строки в python.
- 13. Ошибка Python argparse «непризнанные аргументы»
- 14. python argparse: непризнанные аргументы
- 15. Аргументы командной строки в Python с sys.argv
- 16. Аргументы командной строки Python (Windows)
- 17. Python аргументы командной строки Linux
- 18. python argparse - передать значения WITHOUT командной строки
- 19. Argparse и синтаксис командной строки
- 20. python argparse - пропустить список для argparse без командной строки
- 21. Только один аргумент командной строки с argparse
- 22. С командной строки Аргументы
- 23. Как аргументы командной строки Python связаны с методами?
- 24. Python argparse разобрать непризнанные аргументы
- 25. Python argparse игнорировать конкатенированные аргументы?
- 26. Python анализирующие аргументы из командной строки
- 27. Получить параметры командной строки с помощью argparse
- 28. Передача строки с использованием argparse
- 29. Аргументарные аргументы командной строки в python
- 30. Как разбирать аргументы командной строки в Python?
ли жизнеспособный вариант (эстетическая точка зрения), чтобы сделать что-то вроде '--action = свалки -csv' или '--action = dump-some-other-format'? Это позволило бы устранить проблему «требуемых вариантов». – dcrosta
@ dcrosta это, очевидно, сработает, но я предпочитаю не идти таким образом, я нахожу это громоздким. –
Справедливо, просто хотел убедиться, что вы накрыли очевидные базы. – dcrosta