Python3 argparse: при передаче строки в виде аргумента arg запускайте funcA, если пунктирная arg запускает другую функцию - PullRequest
1 голос
/ 10 февраля 2020

Вот что я пытаюсь выполнить sh:

При передаче строки в качестве аргумента вызовите функцию write_text ()

python3 app.py write this text to file

При передаче пунктирного аргумента вызовите другую функцию, в этом случае read_text ()

python3 app.py -r

При передаче аргумента без аргументов выведите справку

python3 app.py


Вот что у меня есть:

parser = argparse.ArgumentParser()
parser.add_argument('text', help="write text to file")
parser.add_argument('-r', '--read', help="read text from file")
args = parser.parse_args()
...
def main():
  if args.read:
    read_text()
  elif args.text:
    write_text(args.text)
  else:
    parser.print_help()

Проблема в том, что когда я звоню просто -r, он жалуется, что отсутствует команда для text, потому что text не необязательный аргумент.

Я пытался создать подкоманды и сделать все подкоманды args, но затем необходимо явно вызвать аргумент text, например python3 app.py text.

Возможно, я тоже думаю Тяжело на этом и упускать из виду простое решение. У меня это отлично работало, просто разбирая sys.argv, но это было не красиво. И встроенная функция помощи также полезна.

Заранее спасибо!


Редактировать:

Вот что у меня сейчас работает

parser = argparse.ArgumentParser()
parser.add_argument('text', nargs='*', help="write text to file")
parser.add_argument('-r', '--read', action='store_true', help="read text from file")
args = parser.parse_args()
...
def main():
  if args.read:
    read_text()
  elif args.text:
    text = " ".join(args.text)    
    write_text(text)
  else:
    parser.print_help()

Все еще думая, что может быть более чистый способ сделать это ...

1 Ответ

0 голосов
/ 10 февраля 2020

Это может помочь:

parser.add_argument('text', nargs='?', help="write text to file")

больше информации: https://docs.python.org/3/library/argparse.html#nargs


Обратите внимание, что вы должны использовать action='store_true' для прочитайте аргумент, если вы хотите позже использовать args.read как логическое значение.

parser.add_argument('-r', '--read', action='store_true', help="read text from file")
...