TL; DR,我需要获取包含参数的用户输入才能执行某项操作,我需要自己的脚本来获取用户输入,并像其自己的解释器一样工作。
我的目标是使用自己的命令创建自己的CLI。我现在需要的是在python脚本中获取用户输入。 CLI的语法如下:(我不知道该怎么做)
COMMAND + ARGUMENT1 + ARGUMENT2 + ARGUMENT3
我想做的事的例子:
say "hi this is a test"
hi this is a test
我有一个计划,使我可以使用带参数的命令,我创建了一个名为“ bin”的文件夹,并将python脚本放入其中。python脚本内部是函数。根据命令的类型,我可以调用函数来执行某些操作,或者打印输出。
但是现在,我需要知道如何使用ARGUMENTS获得用户输入
[@ 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
模块是生成命令提示符的另一种内置方法,但是它不为您进行解析,因此您可以将其与argparse
和shlex
结合使用。
您可以使用argparse,请检查:https://docs.python.org/3/library/argparse.html
我知道我已经有一个可以回答的问题。
您可以在这里找到它: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("")