「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > イントロスペクション、クリック、リッチフォーマットを使用して Python CLI の対話型チャットを構築する方法

イントロスペクション、クリック、リッチフォーマットを使用して Python CLI の対話型チャットを構築する方法

2024 年 11 月 8 日に公開
ブラウズ:960

How to Build an Interactive Chat for Your Python CLI Using Introspection, Click, and Rich Formatting

CLI をよりインタラクティブかつダイナミックにしたい場合は、リアルタイム コマンド対話システムを構築することが答えになる可能性があります。 Python のイントロスペクション機能、コマンドの管理に Click、出力のフォーマットに Rich を活用することで、ユーザー入力にインテリジェントに応答する強力で柔軟な CLI を作成できます。各コマンドを手動でハードコーディングする代わりに、CLI がコマンドを自動的に検出して実行できるため、ユーザー エクスペリエンスがよりスムーズで魅力的になります。

カラフルなコンソールのカオス: クリック コマンドとリッチな出力が融合します。端末ですらスタイリッシュに見せたがるからです。

クリックとマークダウンを使用する理由

Click により、コマンドの管理、引数の解析、ヘルプの生成が簡素化されます。また、コマンドの構造化とオプションの処理も簡単になります。

Rich を使用すると、美しくフォーマットされた Markdown をターミナルに直接出力できるため、結果が機能するだけでなく視覚的にも魅力的になります。

これら 2 つのライブラリと Python イントロスペクションを組み合わせることで、出力を豊富で読みやすい形式で表示しながら、コマンドを動的に検出して実行する対話型チャット機能を構築できます。 実践的な例については、StoryCraftr が同様のアプローチを使用して AI 主導の執筆ワークフローを合理化する方法をご覧ください: https://storycraftr.app.

インタラクティブなチャット システムの構築

1. 基本的なチャットコマンドの設定

チャット コマンドはセッションを初期化し、ユーザーが CLI を操作できるようにします。ここでは、ユーザー入力をキャプチャし、適切なクリック コマンドに動的にマッピングされます。

import os
import click
import shlex
from rich.console import Console
from rich.markdown import Markdown

console = Console()

@click.command()
@click.option("--project-path", type=click.Path(), help="Path to the project directory")
def chat(project_path=None):
    """
    Start a chat session with the assistant for the given project.
    """
    if not project_path:
        project_path = os.getcwd()

    console.print(
        f"Starting chat for [bold]{project_path}[/bold]. Type [bold green]exit()[/bold green] to quit."
    )

    # Start the interactive session
    while True:
        user_input = console.input("[bold blue]You:[/bold blue] ")

        # Handle exit
        if user_input.lower() == "exit()":
            console.print("[bold red]Exiting chat...[/bold red]")
            break

        # Call the function to handle command execution
        execute_cli_command(user_input)

2. コマンドを検出して実行するためのイントロスペクション

Python イントロスペクションを使用して、使用可能なコマンドを動的に検出し、実行します。ここで重要な部分の 1 つは、Click コマンドが装飾された関数であるということです。実際のロジックを実行するには、装飾されていない関数 (つまり、コールバック) を呼び出す必要があります。

イントロスペクションを使用してコマンドを動的に実行し、Click のデコレータを処理する方法は次のとおりです:

import inspect
import your_project_cmd  # Replace with your actual module containing commands

command_modules = {"project": your_project_cmd}  # List your command modules here

def execute_cli_command(user_input):
    """
    Function to execute CLI commands dynamically based on the available modules,
    calling the undecorated function directly.
    """
    try:
        # Use shlex.split to handle quotes and separate arguments correctly
        parts = shlex.split(user_input)
        module_name = parts[0]
        command_name = parts[1].replace("-", "_")  # Replace hyphens with underscores
        command_args = parts[2:]  # Keep the rest of the arguments as a list

        # Check if the module exists in command_modules
        if module_name in command_modules:
            module = command_modules[module_name]

            # Introspection: Get the function by name
            if hasattr(module, command_name):
                cmd_func = getattr(module, command_name)

                # Check if it's a Click command and strip the decorator
                if hasattr(cmd_func, "callback"):
                    # Call the underlying undecorated function
                    cmd_func = cmd_func.callback

                # Check if it's a callable (function)
                if callable(cmd_func):
                    console.print(
                        f"Executing command from module: [bold]{module_name}[/bold]"
                    )

                    # Directly call the function with the argument list
                    cmd_func(*command_args)
                else:
                    console.print(
                        f"[bold red]'{command_name}' is not a valid command[/bold red]"
                    )
            else:
                console.print(
                    f"[bold red]Command '{command_name}' not found in {module_name}[/bold red]"
                )
        else:
            console.print(f"[bold red]Module {module_name} not found[/bold red]")
    except Exception as e:
        console.print(f"[bold red]Error executing command: {str(e)}[/bold red]")

これはどのように作動しますか?

  • 入力解析: コマンドライン引数のように入力を処理するために shlex.split を使用します。これにより、引用符で囲まれた文字列と特殊文字が正しく処理されるようになります。
  • モジュールとコマンドの検索: 入力は module_name と command_name に分割されます。コマンド名は、Python 関数名と一致するようにハイフンをアンダースコアに置き換えるように処理されます。
  • Introspection: getattr() を使用して、モジュールからコマンド関数を動的に取得します。 Click コマンドの場合 (つまり、コールバック属性がある場合)、Click デコレータを削除することで実際の関数ロジックにアクセスします。
  • コマンド実行: 装飾されていない関数を取得したら、Python 関数を直接呼び出しているかのように、引数を渡してそれを呼び出します。

3. CLI コマンドの例

ユーザーがチャットを通じて対話的に呼び出すことができるプロジェクト モジュール内のサンプル コマンドをいくつか考えてみましょう:

@click.group()
def project():
    """Project management CLI."""
    pass

@project.command()
def init():
    """Initialize a new project."""
    console.print("[bold green]Project initialized![/bold green]")

@project.command()
@click.argument("name")
def create(name):
    """Create a new component in the project."""
    console.print(f"[bold cyan]Component {name} created.[/bold cyan]")

@project.command()
def status():
    """Check the project status."""
    console.print("[bold yellow]All systems operational.[/bold yellow]")

チャットインターフェイスの実行

対話型チャット システムを実行するには:

  1. モジュール (プロジェクトなど) が command_modules にリストされていることを確認してください。
  2. コマンドを実行します:
python your_cli.py chat --project-path /path/to/project

セッションが開始されると、ユーザーは次のようなコマンドを入力できます:

You: project init You: project create "Homepage"

出力は、Rich Markdown を使用して整形式で表示されます:

[bold green]Project initialized![/bold green] [bold cyan]Component Homepage created.[/bold cyan]

結論

コマンド管理用の Click、Markdown フォーマット用の Rich、および Python イントロスペクションを組み合わせることで、CLI 用の強力でインタラクティブなチャット システムを構築できます。このアプローチにより、出力をエレガントで読みやすい形式で表示しながら、コマンドを動的に検出して実行できます。

主なハイライト:

  • 動的コマンド実行: イントロスペクションを使用すると、ハードコーディングせずにコマンドを検出して実行できます。
  • リッチ出力: リッチ マークダウンを使用すると、出力が読みやすく、視覚的に魅力的になります。
  • 柔軟性: この設定により、コマンドの構造と実行に柔軟性が与えられます。
リリースステートメント この記事は次の場所に転載されています: https://dev.to/rodrigo_estrada_79e6022e9/how-to-build-an-interactive-chat-for-your-python-cli-using-introspection-click-and-rich-formatting-4l9a? 1 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • CSSは、属性値に基づいてHTML要素を見つけることができますか?
    CSSは、属性値に基づいてHTML要素を見つけることができますか?
    をCSS の属性値でHTML要素をターゲットとするCSSのターゲティング、以下の例に示すように、特定の属性に基づいてターゲット要素をターゲットにすることが可能です: [型]入力[型]入力[タイプ] { フォントファミリー:コンソラ。 } input[type=text] { ...
    プログラミング 2025-06-29に投稿されました
  • CSSを使用してChromeとFirefoxのコンソール出力を着色できますか?
    CSSを使用してChromeとFirefoxのコンソール出力を着色できますか?
    javaScriptコンソールの色の表示 は、クロムのコンソールを使用してエラー用の赤、警告用のオレンジ、コンソール用グリーンなどの色のテキストを表示することは可能です。メッセージ? 回答 はい、CSSを使用して、ChromeとFirefox(バージョン31以降)のコンソールに表示さ...
    プログラミング 2025-06-29に投稿されました
  • FASTAPIカスタム404ページ作成ガイド
    FASTAPIカスタム404ページ作成ガイド
    custom 404 Fastapi を備えたPage not foundページを作成するためのカスタム404が作成されていないページを作成すると、Fastapiはいくつかのアプローチを提供します。適切な方法は、特定の要件に依存します。 call_next(リクエスト) respons...
    プログラミング 2025-06-29に投稿されました
  • CSSは言語分析を強く入力しました
    CSSは言語分析を強く入力しました
    プログラミング言語を分類する方法の1つは、それがどれほど強くまたは弱く入力されているかによってです。ここで、「タイプされた」とは、変数がコンパイル時に既知の場合を意味します。これの例は、整数(1)が整数( "1")を含む文字列に追加されるシナリオです: result = 1 ...
    プログラミング 2025-06-29に投稿されました
  • PHP Future:適応と革新
    PHP Future:適応と革新
    PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイ...
    プログラミング 2025-06-29に投稿されました
  • オブジェクトフィット:IEとEdgeでカバーが失敗します、修正方法は?
    オブジェクトフィット:IEとEdgeでカバーが失敗します、修正方法は?
    object-fit:カバーがIEとEDGEで失敗します。 CSSでは、一貫した画像の高さを維持するために、ブラウザ全体でシームレスに動作します。ただし、IEとEdgeでは、独特の問題が発生します。ブラウザをスケーリングすると、画像は高さをズームするのではなく幅でサイズを変更し、外観を歪め...
    プログラミング 2025-06-29に投稿されました
  • 年と四半期の列をパンダの1つの定期的な列にマージする方法は?
    年と四半期の列をパンダの1つの定期的な列にマージする方法は?
    新しい期間の列の列の連結 問題ステートメント: 2000 Q2 2001 Q3 目的は、「年」と「四分の一」の列を組み合わせて「期間」と呼ばれる新しい列を作成して、次の結果を取得することです。 2001q3 ソリューション: はpythonで文字列列を連結するために、...
    プログラミング 2025-06-29に投稿されました
  • オブジェクトがPythonに特定の属性を持っているかどうかを確認する方法は?
    オブジェクトがPythonに特定の属性を持っているかどうかを確認する方法は?
    メソッドオブジェクト属性の存在を決定するメソッド この問い合わせは、オブジェクト内の特定の属性の存在を検証する方法を求めています。未定義のプロパティにアクセスしようとする試みがエラーを提起する次の例を考えてみましょう: >>> a = SomeClass() >&g...
    プログラミング 2025-06-29に投稿されました
  • ユーザーローカルタイムフォーマットとタイムゾーンオフセットディスプレイガイド
    ユーザーローカルタイムフォーマットとタイムゾーンオフセットディスプレイガイド
    をタイムオフセットでユーザーのロケール形式で表示する をエンドユーザーに提示する場合、ローカルタイムゾーンとフォーマットに表示することが重要です。これにより、さまざまな地理的位置にわたって明確でシームレスなユーザーエクスペリエンスが保証されます。 JavaScriptを使用してこれを達成す...
    プログラミング 2025-06-29に投稿されました
  • 1つのトランザクションでデータを複数のMySQLテーブルに効率的に挿入する方法は?
    1つのトランザクションでデータを複数のMySQLテーブルに効率的に挿入する方法は?
    mysqlは複数のテーブルに挿入されます 単一のMySQLクエリを持つ複数のテーブルにデータを挿入しようとすると、予期しない結果が得られる場合があります。複数のクエリが問題を解決するように思われるかもしれませんが、プロファイルテーブルのユーザーテーブルからマニュアルユーザーIDに自動イン...
    プログラミング 2025-06-29に投稿されました
  • PHPで空の配列を効率的に検出する方法は?
    PHPで空の配列を効率的に検出する方法は?
    チェックアレイ空虚のphp の空の配列は、さまざまなアプローチを通じてPHPで決定できます。アレイ要素の存在を確認する必要がある場合、PHPのルーズタイピングにより、配列自体の直接評価が可能になります。 //リストは空です。 } if (!$playerlist) { ...
    プログラミング 2025-06-29に投稿されました
  • Microsoft Visual C ++が2フェーズテンプレートのインスタンス化を正しく実装できないのはなぜですか?
    Microsoft Visual C ++が2フェーズテンプレートのインスタンス化を正しく実装できないのはなぜですか?
    Microsoft Visual Cの「壊れた」2フェーズテンプレートのインスタンス化の謎 問題声明: ユーザーは、Microsoft Visual C(MSVC)の懸念を表現する一般的な懸念を表明します。メカニズムの特定の側面は、予想どおりに動作できませんか?ただし、このチェックがテンプ...
    プログラミング 2025-06-29に投稿されました
  • 偽のウェイクアップは本当にJavaで起こりますか?
    偽のウェイクアップは本当にJavaで起こりますか?
    Javaの偽りの目覚め:現実か神話ですか?そのような動作の可能性は存在しますが、問題は残ります:それらは実際に実際に発生しますか?プロセスが信号を受信すると、EINTRで突然戻ってきて、ブロッキングシステムの呼び出しを早期に終了させる可能性があります。その結果、POSIX信号はスプリアスウェ...
    プログラミング 2025-06-29に投稿されました
  • 動的にサイズの親要素内の要素のスクロール範囲を制限する方法は?
    動的にサイズの親要素内の要素のスクロール範囲を制限する方法は?
    垂直スクロール要素のcss高さ制限の実装 インタラクティブインターフェイスで、要素のスクロール挙動を制御することは、ユーザーエクスペリエンスとアクセシビリティを確保するために不可欠です。そのようなシナリオの1つは、動的にサイズの親要素内の要素のスクロール範囲を制限することです。ただし、マッ...
    プログラミング 2025-06-29に投稿されました
  • Python環境変数のアクセスおよび管理方法
    Python環境変数のアクセスおよび管理方法
    Python の環境変数へのアクセスPythonの環境変数にアクセスするには、 os.environ オブジェクトを利用します。デフォルトでは、マッピング内の変数にアクセスすると、インタープリターにPython辞書の値を検索するように促します。 print(os.environ [&#...
    プログラミング 2025-06-29に投稿されました

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3