Python CMD模块:-h后,Shell退出

2024-09-27 01:19:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在用python用CMD和一些Youtube特性制作一个shell,我已经差不多完成了,函数可以正常工作,但是由于某种原因,shell在我尝试[command]-h之后退出了(我使用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还是个新手,如果有任何反馈,我将不胜感激


Tags: the函数inaddparserforsonghelp
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,并将其视为命令结束

它在-h线上写了什么

show this help message and exit

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

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

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

将显示帮助而不退出。我经常在测试的时候用这个

相关问题 更多 >

    热门问题