使用Python获取带有参数的用户输入

问题描述 投票:0回答:3

TL; DR,我需要获取包含参数的用户输入才能执行某项操作,我需要自己的脚本来获取用户输入,并像其自己的解释器一样工作。

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

COMMAND + ARGUMENT1 + ARGUMENT2 + ARGUMENT3

我想做的事的例子:

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

我有一个计划,使我可以使用带参数的命令,我创建了一个名为“ bin”的文件夹,并将python脚本放入其中。python脚本内部是函数。根据命令的类型,我可以调用函数来执行某些操作,或者打印输出。

但是现在,我需要知道如何使用ARGUMENTS获得用户输入

python command-line-interface
3个回答
1
投票

[@ ToTheMax表示的内置argparse模块可以创建复杂的命令行界面。

默认情况下,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模块是生成命令提示符的另一种内置方法,但是它不为您进行解析,因此您可以将其与argparseshlex结合使用。


0
投票

您可以使用argparse,请检查:https://docs.python.org/3/library/argparse.html


0
投票

我知道我已经有一个可以回答的问题。

您可以在这里找到它:How do you have an input statement with multiple arguments that are stored into a variable?

这里是正确的代码:

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("")
© www.soinside.com 2019 - 2024. All rights reserved.