Получить пользовательский ввод с аргументами в Python - PullRequest
0 голосов
/ 07 апреля 2020

TL; DR Мне нужно получить пользовательский ввод, содержащий аргумент, чтобы что-то сделать, мне нужен собственный скрипт, который получает ввод от пользователя и действует как его собственный интерпретатор.

Моя цель - сделать свой собственный CLI с моими собственными командами. Теперь мне нужно получить пользовательский ввод в скрипте python. Грамматика для моего CLI ниже: (То, что я не знаю, как сделать)

COMMAND + ARGUMENT1 + ARGUMENT2 + ARGUMENT3

Пример того, что я хочу сделать:

say "hi this is a test"
hi this is a test

У меня есть план для того, как я могу создавать команды с аргументами, я создаю папку с именем «bin» и помещаю в них скрипты python. Внутри скриптов python есть функции. В зависимости от типа команды, я вызываю функции, которые что-то делают, или выводит вывод.

Но сейчас мне нужно знать, КАК получить ввод пользователя с помощью ARGUMENTS

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Встроенный модуль argparse, как сказал @ToTheMax, может создавать сложные интерфейсы командной строки.

По умолчанию argparse.ArgumentParser.parse_args() будет читать аргументы командной строки для вашей утилиты из sys.argv, но если вы передать массив, он будет использовать его вместо этого.

Вы можете lex (разделить на массив "слов") строку так же, как оболочка использует shlex.split(), которая также встроена. Если вы используете кавычки, как в вашем примере, слова между ними не будут разделяться, как в оболочке.

Вот полный пример. Обратитесь к документации, потому что это предварительное использование argparse. Есть раздел, в котором говорится о «подкомандах», на которых основан этот пример.

import argparse
import shlex

def do_say(args):
    print(args.what)

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
say_command = subparsers.add_parser('say')
say_command.add_argument('what')
say_command.set_defaults(func=do_say)

command = 'say "hi this is a test"'

args = parser.parse_args(shlex.split(command))
args.func(args)

Модуль cmd - это еще один встроенный способ создания командной строки, но он этого не делает. сделайте разбор за вас, так что вы можете объединить его с argparse и shlex.

0 голосов
/ 07 апреля 2020

Я понимаю, что у меня уже есть вопрос, на который дан ответ.

Вы можете найти его здесь: Как у вас есть оператор ввода с несколькими аргументами, которые хранятся в переменной?

Вот правильный код:

def command_split(text:str) -> (str,str):
    """Split a string in a command and any optional arugments"""
    text = text.strip() # basic sanitize input
    space = text.find(' ')
    if space > 0:
        return text[:space],text[space+1:]
    return text,None

x = input(":>")
command,args = command_split(x)
# print (f'command: "{command:}", args: "{args}"')

if command == 'echo':
    if args == None:
        raise SyntaxError
    print (args)

Более простой способ:

x = input(":>")
if x.split(" ")[0] == 'echo':
    echoreturn = ' '.join(x.split(" ")[1:])
    print(echoreturn)

Моя версия сообщения @rgov: (Спасибо!)

import argparse
import shlex

def do_say(args):
    print(args.what)

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
say_command = subparsers.add_parser('say')
say_command.add_argument('what')
say_command.set_defaults(func=do_say)

while True:
    try:

        command = input(":>")

        args = parser.parse_args(shlex.split(command))
        args.func(args)
    except SyntaxError:
        print("Syntax Error")
    except ValueError:
        print("Value Error")
    except:
        print("")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...