2017-03-23 41 views
0

这是我的第一个问题,所以如果出现任何错误,我很抱歉。我使用CMD与一些Youtube功能,我几乎完成,功能工作属性,但由于某种原因,外壳退出后,我尝试[命令] -h(我使用argparse此)Python CMD模块:Shell退出后-h

这里是发生了什么给你看一个例子:

As you can see, arguments help gets printed but then it quits the 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很陌生,并会很感激任何反馈。

+0

这是在'argparse'内建的。请参阅它之前添加的选项:'-h/- help'。但为什么你有这个问题? –

+0

请勿将文字作为图片发布,请将其复制粘贴。 –

回答

0

这对-h行有什么影响?

show this help message and exit 

随着subparsers你可以得到的帮助下几个层次,一个用于主解析器和一个用于每个子分析器。

这与-h--help在命令行正常行为,无论是使用外壳命令(例如ls -h)或使用​​脚本。

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

将显示帮助而不退出。我经常在测试时使用它。

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并将其视为命令结束。