2017-03-23 79 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並將其視爲命令結束。