使用Python中的参数获取用户输入

使用Python中的参数获取用户输入,python,command-line-interface,Python,Command Line Interface,TL;DR我需要得到一个包含参数的用户输入,为了做一些事情,我需要我自己的脚本来获得用户输入,就像它自己的解释器一样 我的目标是使用自己的命令创建自己的CLI。 我现在需要的是在python脚本中获取用户输入。我的CLI语法如下:我不知道怎么做 COMMAND + ARGUMENT1 + ARGUMENT2 + ARGUMENT3 我想做的示例: say "hi this is a test" hi this is a test 我有一个计划,如何使用参数生成命令, 我创建了一个名为“bin

TL;DR我需要得到一个包含参数的用户输入,为了做一些事情,我需要我自己的脚本来获得用户输入,就像它自己的解释器一样

我的目标是使用自己的命令创建自己的CLI。 我现在需要的是在python脚本中获取用户输入。我的CLI语法如下:我不知道怎么做

COMMAND + ARGUMENT1 + ARGUMENT2 + ARGUMENT3
我想做的示例:

say "hi this is a test"
hi this is a test
我有一个计划,如何使用参数生成命令, 我创建了一个名为“bin”的文件夹,并将python脚本放入其中。 python脚本中包含函数。 根据命令类型,要么调用函数do do some,要么打印输出

但是现在,我需要知道如何使用参数获取用户输入。

正如@ToTheMax所说的内置argparse模块可以创建复杂的命令行界面

默认情况下,argparse.ArgumentParser.parse_args将从sys.argv向实用程序读取命令行参数,但如果传入数组,它将使用它

您可以将lex拆分为一个字符串的单词数组,就像shell使用shlex.split一样,shlex.split也是内置的。如果像在示例中那样使用引号,它们之间的单词不会像在shell中一样分开

这里有一个完整的例子。请参阅文档,因为这是argparse的一个高级用法。有一节讨论子命令,这就是本例所基于的

导入argparse 导入shlex def do_sayargs: 什么 parser=argparse.ArgumentParser subparsers=parser.add_subparsers say_command=subparsers。添加_解析器“say” 说出命令。添加参数“what” say_command.set_defaultsfunc=do_say command='说嗨,这是一个测试' args=parser.parse\u argsshlex.splitcommand args.funcargs
cmd模块是生成命令提示符的另一种内置方式,但它不为您进行解析,因此您可能会将其与argparse和shlex结合使用。

我意识到我已经有一个问题得到了回答

你可以在这里找到它:

以下是正确的代码:

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("")