cmd —行指向のコマンドインタープリターのサポート—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/library/cmd
移動先:案内検索

cmd —行指向のコマンドインタープリターのサポート

ソースコード: :source: `Lib / cmd.py`



Cmd クラスは、行指向のコマンドインタープリターを作成するための単純なフレームワークを提供します。 これらは、後でより洗練されたインターフェイスにラップされるテストハーネス、管理ツール、およびプロトタイプに役立つことがよくあります。

class cmd.Cmd(completekey='tab', stdin=None, stdout=None)

Cmd インスタンスまたはサブクラスインスタンスは、行指向のインタープリターフレームワークです。 Cmd 自体をインスタンス化する正当な理由はありません。 むしろ、 Cmd のメソッドを継承し、アクションメソッドをカプセル化するために、自分で定義したインタープリタークラスのスーパークラスとして役立ちます。

オプションの引数 completekey は、完了キーの readline 名です。 デフォルトは Tab です。 completekeyNone でなく、 readline が使用可能な場合、コマンド補完は自動的に行われます。

オプションの引数 stdin および stdout は、Cmdインスタンスまたはサブクラスインスタンスが入力および出力に使用する入力および出力ファイルオブジェクトを指定します。 指定しない場合、デフォルトで sys.stdin および sys.stdout になります。

特定の stdin を使用する場合は、インスタンスの use_rawinput 属性をFalseに設定してください。そうしないと、 stdin は無視されます。

Cmdオブジェクト

Cmd インスタンスには次のメソッドがあります。

Cmd.cmdloop(intro=None)

プロンプトを繰り返し発行し、入力を受け入れ、受信した入力から最初のプレフィックスを解析し、アクションメソッドにディスパッチして、行の残りの部分を引数として渡します。

オプションの引数は、最初のプロンプトの前に発行されるバナーまたはイントロ文字列です(これはイントロクラス属性をオーバーライドします)。

readline モジュールがロードされると、入力は自動的に bash のような履歴リスト編集を継承します(例: Control-P は最後のコマンドにスクロールバックし、 Control-N は次のコマンドに進み、 Control-F はカーソルを非破壊的に右に移動します。 Control-B は、カーソルを非破壊的に左に移動します。

入力時のファイルの終わりは、文字列'EOF'として返されます。

インタプリタインスタンスは、メソッドdo_foo()がある場合にのみ、コマンド名fooを認識します。 特別な場合として、文字'?'で始まる行がメソッドdo_help()にディスパッチされます。 別の特殊なケースとして、文字'!'で始まる行がメソッドdo_shell()にディスパッチされます(そのようなメソッドが定義されている場合)。

このメソッドは、 postcmd()メソッドが真の値を返すときに返されます。 postcmd()stop 引数は、コマンドの対応するdo_*()メソッドからの戻り値です。

完了が有効になっている場合、コマンドの完了は自動的に実行され、コマンドargsの完了は、引数 textline 、 begidx [を指定してcomplete_foo()を呼び出すことによって実行されます。 X190X]、および endidxtext は、一致させようとしている文字列プレフィックスです。返されるすべての一致は、それで始まる必要があります。 line は、先頭の空白が削除された現在の入力行です。 begidxendidx は、プレフィックステキストの開始インデックスと終了インデックスであり、異なる情報を提供するために使用できます。引数がどの位置にあるかに応じて完了します。

Cmd のすべてのサブクラスは、事前定義されたdo_help()を継承します。 このメソッドは、引数'bar'を指定して呼び出され、対応するメソッドhelp_bar()を呼び出します。それが存在しない場合は、do_bar()のdocstring(使用可能な場合)を出力します。 引数なしで、do_help()は、使用可能なすべてのヘルプトピック(つまり、対応するhelp_*()メソッドを持つすべてのコマンドまたはdocstringを持つコマンド)を一覧表示し、文書化されていないコマンドも一覧表示します。

Cmd.onecmd(str)
プロンプトに応答して入力されたかのように引数を解釈します。 これはオーバーライドできますが、通常はオーバーライドする必要はありません。 便利な実行フックについては、 precmd()および postcmd()メソッドを参照してください。 戻り値は、インタプリタによるコマンドの解釈を停止するかどうかを示すフラグです。 コマンド strdo_*()メソッドがある場合は、そのメソッドの戻り値が返されます。それ以外の場合は、 default()メソッドからの戻り値が返されます。
Cmd.emptyline()
プロンプトに応答して空の行が入力されたときに呼び出されるメソッド。 このメソッドがオーバーライドされない場合、最後に入力された空でないコマンドが繰り返されます。
Cmd.default(line)
コマンドプレフィックスが認識されないときに入力行で呼び出されるメソッド。 このメソッドがオーバーライドされていない場合は、エラーメッセージが出力されて返されます。
Cmd.completedefault(text, line, begidx, endidx)
コマンド固有のcomplete_*()メソッドが使用できない場合に、入力行を完了するために呼び出されるメソッド。 デフォルトでは、空のリストを返します。
Cmd.precmd(line)
コマンドライン line が解釈される直前、ただし入力プロンプトが生成および発行された後に実行されるフックメソッド。 このメソッドは Cmd のスタブです。 サブクラスによってオーバーライドされるために存在します。 戻り値は、 onecmd()メソッドによって実行されるコマンドとして使用されます。 precmd()実装は、コマンドを書き直すか、単に line を変更せずに返す場合があります。
Cmd.postcmd(stop, line)
コマンドディスパッチが終了した直後に実行されるフックメソッド。 このメソッドは Cmd のスタブです。 サブクラスによってオーバーライドされるために存在します。 line は実行されたコマンドラインであり、 stop は、 postcmd()の呼び出し後に実行を終了するかどうかを示すフラグです。 これは、 onecmd()メソッドの戻り値になります。 このメソッドの戻り値は、 stop に対応する内部フラグの新しい値として使用されます。 falseを返すと、解釈が続行されます。
Cmd.preloop()
cmdloop()が呼び出されたときに1回実行されるフックメソッド。 このメソッドは Cmd のスタブです。 サブクラスによってオーバーライドされるために存在します。
Cmd.postloop()
cmdloop()が戻ろうとしているときに1回実行されるフックメソッド。 このメソッドは Cmd のスタブです。 サブクラスによってオーバーライドされるために存在します。

Cmd サブクラスのインスタンスには、いくつかのパブリックインスタンス変数があります。

Cmd.prompt
入力を求めるために発行されたプロンプト。
Cmd.identchars
コマンドプレフィックスとして受け入れられる文字列。
Cmd.lastcmd
最後に表示された空でないコマンドプレフィックス。
Cmd.cmdqueue
キューに入れられた入力行のリスト。 cmdqueueリストは、新しい入力が必要なときに cmdloop()でチェックされます。 空でない場合、その要素は、プロンプトで入力されたかのように順番に処理されます。
Cmd.intro
イントロまたはバナーとして発行する文字列。 cmdloop()メソッドに引数を指定することでオーバーライドできます。
Cmd.doc_header
ヘルプ出力に文書化されたコマンドのセクションがある場合に発行するヘッダー。
Cmd.misc_header
ヘルプ出力にその他のヘルプトピックのセクションがある場合に発行するヘッダー(つまり、対応するdo_*()メソッドのないhelp_*()メソッドがあります)。
Cmd.undoc_header
ヘルプ出力に文書化されていないコマンドのセクションがある場合に発行するヘッダー(つまり、対応するhelp_*()メソッドのないdo_*()メソッドがあります)。
Cmd.ruler
ヘルプメッセージヘッダーの下に区切り線を描画するために使用される文字。 空の場合、定規の線は描画されません。 デフォルトは'='です。
Cmd.use_rawinput
デフォルトがtrueのフラグ。 trueの場合、 cmdloop()input()を使用してプロンプトを表示し、次のコマンドを読み取ります。 falseの場合、sys.stdout.write()およびsys.stdin.readline()が使用されます。 (これは、 readline をインポートすることにより、それをサポートするシステムで、インタープリターが Emacs のような行編集とコマンド履歴キーストロークを自動的にサポートすることを意味します。)


Cmdの例

cmd モジュールは主に、ユーザーがプログラムをインタラクティブに操作できるようにするカスタムシェルを構築するのに役立ちます。

このセクションでは、 turtle モジュールのいくつかのコマンドの周りにシェルを構築する方法の簡単な例を示します。

forward()などの基本的なタートルコマンドは、do_forward()という名前のメソッドを使用して Cmd サブクラスに追加されます。 引数は数値に変換され、turtleモジュールにディスパッチされます。 docstringは、シェルが提供するヘルプユーティリティで使用されます。

この例には、 precmd()メソッドで実装された基本的な記録および再生機能も含まれています。このメソッドは、入力を小文字に変換し、コマンドをファイルに書き込む役割を果たします。 do_playback()メソッドはファイルを読み取り、記録されたコマンドをcmdqueueに追加して、すぐに再生できるようにします。

import cmd, sys
from turtle import *

class TurtleShell(cmd.Cmd):
    intro = 'Welcome to the turtle shell.   Type help or ? to list commands.\n'
    prompt = '(turtle) '
    file = None

    # ----- basic turtle commands -----
    def do_forward(self, arg):
        'Move the turtle forward by the specified distance:  FORWARD 10'
        forward(*parse(arg))
    def do_right(self, arg):
        'Turn turtle right by given number of degrees:  RIGHT 20'
        right(*parse(arg))
    def do_left(self, arg):
        'Turn turtle left by given number of degrees:  LEFT 90'
        left(*parse(arg))
    def do_goto(self, arg):
        'Move turtle to an absolute position with changing orientation.  GOTO 100 200'
        goto(*parse(arg))
    def do_home(self, arg):
        'Return turtle to the home position:  HOME'
        home()
    def do_circle(self, arg):
        'Draw circle with given radius an options extent and steps:  CIRCLE 50'
        circle(*parse(arg))
    def do_position(self, arg):
        'Print the current turtle position:  POSITION'
        print('Current position is %d %d\n' % position())
    def do_heading(self, arg):
        'Print the current turtle heading in degrees:  HEADING'
        print('Current heading is %d\n' % (heading(),))
    def do_color(self, arg):
        'Set the color:  COLOR BLUE'
        color(arg.lower())
    def do_undo(self, arg):
        'Undo (repeatedly) the last turtle action(s):  UNDO'
    def do_reset(self, arg):
        'Clear the screen and return turtle to center:  RESET'
        reset()
    def do_bye(self, arg):
        'Stop recording, close the turtle window, and exit:  BYE'
        print('Thank you for using Turtle')
        self.close()
        bye()
        return True

    # ----- record and playback -----
    def do_record(self, arg):
        'Save future commands to filename:  RECORD rose.cmd'
        self.file = open(arg, 'w')
    def do_playback(self, arg):
        'Playback commands from a file:  PLAYBACK rose.cmd'
        self.close()
        with open(arg) as f:
            self.cmdqueue.extend(f.read().splitlines())
    def precmd(self, line):
        line = line.lower()
        if self.file and 'playback' not in line:
            print(line, file=self.file)
        return line
    def close(self):
        if self.file:
            self.file.close()
            self.file = None

def parse(arg):
    'Convert a series of zero or more numbers to an argument tuple'
    return tuple(map(int, arg.split()))

if __name__ == '__main__':
    TurtleShell().cmdloop()

これは、ヘルプ機能、コマンドを繰り返すための空白行の使用、および単純な記録と再生機能を示す亀の甲羅のサンプルセッションです。

Welcome to the turtle shell.   Type help or ? to list commands.

(turtle) ?

Documented commands (type help <topic>):
========================================
bye     color    goto     home  playback  record  right
circle  forward  heading  left  position  reset   undo

(turtle) help forward
Move the turtle forward by the specified distance:  FORWARD 10
(turtle) record spiral.cmd
(turtle) position
Current position is 0 0

(turtle) heading
Current heading is 0

(turtle) reset
(turtle) circle 20
(turtle) right 30
(turtle) circle 40
(turtle) right 30
(turtle) circle 60
(turtle) right 30
(turtle) circle 80
(turtle) right 30
(turtle) circle 100
(turtle) right 30
(turtle) circle 120
(turtle) right 30
(turtle) circle 120
(turtle) heading
Current heading is 180

(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 500
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 300
(turtle) playback spiral.cmd
Current position is 0 0

Current heading is 0

Current heading is 180

(turtle) bye
Thank you for using Turtle