2017-03-23 4 views
0

これは私の最初の質問ですので、間違いがあればごめんなさい。Python CMDモジュール:-hの後にシェルが終了する

私はいくつかのYoutubeの機能でCMDを使ってシェルを作っていますが、ほとんど機能していますが、機能はうまく機能しますが、何らかの理由でシェルが終了しました。-h(私はargparse必要に応じて

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

I入力正しい引数がシェル場合が開け続ける:

)このためにここにあなたが見ることのために何が起こるかの一例です。

ここgetSongUrl関数のコードです:この機能のためのパーサはCMDクラスの前に定義されて

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("") 

、これは私がすべての例を見てどのようにされ、ここでパーサーのコードは次のとおりです。

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を使用すると、ヘルプのいくつかのレベル、メインパーサ用と各subparserための1つを得ることができます。

これは、シェルコマンド(ls -hなど)を使用するか、​​を使用するスクリプトを使用するかにかかわらず、コマンドラインで-h--helpと通常の動作です。

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をコンソールループにトラップし、それをコマンドの終わりとして扱うことができます。

関連する問題