Python CMD模块:Shell在-h之后退出

时间:2017-03-23 17:24:01

标签: python shell cmd argparse

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

我使用带有一些Youtube功能的CMD在python中创建一个shell,我几乎已经完成了,函数工作性能但是出于某种原因,shell在我尝试[命令] -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)

提前感谢您提供任何帮助。我还是蟒蛇新手,对任何反馈都很感激。

2 个答案:

答案 0 :(得分:0)

-h行上说了什么?

show this help message and exit

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

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

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

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

答案 1 :(得分:0)

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

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的逻辑,因为您确实希望解析器结束其工作并在打印帮助或看到错误后将控制权返回到控制台循环(而不是命令执行代码)。例如。提出一些具体的例外。

或者,您可以在控制台循环中隐藏 function selText(test){ var arr = test; if (arr == 1){ document.body.style.backgroundImage = "url('https://images6.alphacoders.com/431/thumb-1920-431411.jpg')"; } else if (arr==2){ document.body.style.background = 'none'; } } <button id="btnim" value="1" onclick="selText(this.value)">text</button> <button id="btnim2" value="2" onclick="selText(this.value)">more text</button> 并将其视为命令结束。