6

できればPythonで書かれたCLIをやろうとしています。マルチレベル CLI が必要で、タブ補完が必要です。

cmd モジュール (Python 標準ライブラリから) と readline を "complete" 関数 (タブ補完用) で調べました。

どちらも何かが欠けていました。つまり、次のような複数のレベルを処理する方法がわかりませんでした。

level1
level2
    level2_subcommand_1
    level2_subcommand_2
level3
    level3_subcommand_1

例: 入力した場合:

cmd> level2

、タブ キーを押したときに level2_subcommand_1 と level2_subcommand_2 が表示されるようにしたいのですが、level1 と level3 は表示されません。

cmd lib と readline ではそれができませんでした。

4

2 に答える 2

13

cmdPython 2.6.5のモジュールを使用すると、私にとっては問題なく動作します。これをテストするために使用したサンプルコードは次のとおりです。

import cmd

class MyInterpreter(cmd.Cmd):
    def do_level1(self, args):
        pass

    def do_level2_subcommand_1(self, args):
        pass

    def do_level2_subcommand_2(self, args):
        pass

    def do_level3_subcommand_1(self, args):
        pass

MyInterpreter().cmdloop()

コマンド ラインに「level2」と入力して Tab キーを押すと、level2_subcommand_すべての補完提案に共通のプレフィックスであるため、行が に展開されます。何も入力せずにもう一度 Tab を押すと、次の行が正しく表示level2_subcommand_1され、level2_subcommand_2. これはあなたが探しているものですか?

サブコマンドの場合の別のバリアントは、それらのサブインタープリターを作成することです。

class SubInterpreter(cmd.Cmd):
    prompt = "(level2) "

    def do_subcommand_1(self, args):
        pass

    def do_subcommand_2(self, args):
        pass

    def do_quit(self, args):
        return True
    do_EOF = do_quit

class MyInterpreter(cmd.Cmd):
    def do_level1(self, args):
        pass

    def do_level2(self, args):
        sub_cmd = SubInterpreter()
        sub_cmd.cmdloop()

    def do_level3(self, args):
        pass

上記のバリアントは、「メイン」インタープリターでlevel1, level2andを提供します。メイン インタープリターでlevel3呼び出すと、サブインタープリターが構築され、そのコマンド ループが呼び出されます。level2サブインタープリターはメインインタープリターとは異なるプロンプトを表示するため、現在どのインタープリターにいるのかをいつでも確認できます。サブインタープリターはsubcommand_1、 、subcommand_2subcommand_3およびquit. quitメインのインタープリターに戻ります。EOF 文字も同様です。

于 2010-10-19T15:08:26.317 に答える
0

pypi の argpext モジュールは、コマンド ライン インターフェイス用のマルチレベル サブコマンドを実装します。タブ補完のサポートはありません (まだ?)。

于 2013-03-16T21:20:23.367 に答える