【问题标题】:Get user input with arguments in Python在 Python 中使用参数获取用户输入
【发布时间】:2023-04-02 14:29:01
【问题描述】:

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


    【解决方案1】:

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

    默认情况下,argparse.ArgumentParser.parse_args() 将从sys.argv 读取命令行参数到您的实用程序,但如果您传入一个数组,它将使用它。

    您可以像 shell 使用同样内置的 shlex.split() 一样对字符串进行 lex(拆分为“单词”数组)。如果您在示例中使用引号,则它们之间的单词不会分开,就像在外壳中一样。

    这是一个完整的例子。请参阅文档,因为这是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 结合使用。

    【讨论】:

      【解决方案2】:

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

      您可以在这里找到它: 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("")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多