【问题标题】:Python CMD module: Shell quits after -hPython CMD 模块:Shell 在 -h 后退出
【发布时间】:2017-08-16 09:53:03
【问题描述】:

这是我在这里的第一个问题,如果有任何错误,我很抱歉。

我正在使用具有一些 Youtube 功能的 CMD 在 python 中制作一个 shell,我几乎完成了,功能正常工作,但由于某种原因,我尝试 [command] -h 后 shell 退出(我正在使用 argparse这个)

以下是您可以看到的示例:

As you can see, arguments help gets printed but then it quits the shell

如果我输入正确的参数,shell 会根据需要保持打开状态。

getSongUrl 函数代码如下:

    def do_getSongUrl(self, arg):
    """given a name, returns a list with all the videos and their URLs"""

    args = parser_getSongUrl.parse_args(arg.split())

    song = args.song

    song_str = ' '.join(word for word in song)

    print("Searching: " + song_str)
    print("Limiting results to: " + str(args.limit))

    res = musictools.get_song_urls(song_str)

    for i in range(args.limit):
        for (song_urls, song_titles) in res:
            print(song_titles + ":")
            print(song_urls)
            print("")

这个函数的解析器是在 CMD 类之前定义的,这就是我看到每个例子的方式,下面是解析器的代码:

parser = argparse.ArgumentParser(description='Shell parsers handler')
subparsers = parser.add_subparsers()

parser_getSongUrl = subparsers.add_parser("getSongUrl")

parser_getSongUrl.add_argument("-s", "--song", help="Name of the song", type=str, required="true", nargs="+")
parser_getSongUrl.add_argument("-l", "--limit",  help="Limits the output", type=int, default=10)

提前感谢您的任何帮助。我还是 python 的新手,如果有任何反馈,我将不胜感激。

【问题讨论】:

  • 这是内置在 argparse 中的。查看它在您之前添加的选项:-h/--help。但你为什么有这样的问题?
  • 不要将文字作为图片发布,而是复制粘贴。

标签: python shell cmd argparse


【解决方案1】:

-h 行上的内容是什么?

show this help message and exit

使用subparsers,您可以获得多个级别的帮助,一个用于主解析器,一个用于每个子解析器。

这是在命令行中使用-h--help 时的正常行为,无论是使用shell 命令(例如ls -h)还是使用argparse 的脚本。

parser_getSongUrl.print_help()
parser.print_help()
parser.print_usage()

将在不退出的情况下显示帮助。我经常在测试时使用它。

【讨论】:

    【解决方案2】:

    退出程序是打印帮助后的默认动作:

    class _HelpAction(Action):
        <...>
        def __call__(self, parser, namespace, values, option_string=None):
            parser.print_help()
            parser.exit()
    
    class ArgumentParser(_AttributeHolder, _ActionsContainer): 
        <...>
        def exit(self, status=0, message=None):
            if message:
                self._print_message(message, _sys.stderr)
            _sys.exit(status)
    

    exit() 也从 ArgumentParser.error() 调用,例如在调用会看到无法识别的参数。

    因此,您可以通过替换解析器的 exit() 来更改此行为。您不想改写_HelpAction 的逻辑,因为您确实希望解析器在打印帮助或看到错误后结束其工作并将控制权返回给您的控制台循环(而不是命令执行代码)。例如。通过引发一些特定的异常。

    或者,您可以在控制台循环中捕获 SystemExit 并将其视为命令结束。

    【讨论】:

      猜你喜欢
      • 2018-04-03
      • 2017-01-10
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2015-03-20
      • 2012-09-24
      相关资源
      最近更新 更多