ホームページ >バックエンド開発 >Python チュートリアル >イントロスペクション、クリック、リッチフォーマットを使用して Python CLI の対話型チャットを構築する方法
CLI をよりインタラクティブかつダイナミックにしたいと考えたことがある場合は、リアルタイムのコマンド対話システムを構築することがその答えになる可能性があります。 Python のイントロスペクション機能、コマンドの管理に Click、出力の書式設定に Rich を活用することで、ユーザー入力にインテリジェントに応答する強力で柔軟な CLI を作成できます。各コマンドを手動でハードコーディングする代わりに、CLI がコマンドを自動的に検出して実行できるため、ユーザー エクスペリエンスがよりスムーズで魅力的なものになります。
カラフルなコンソールのカオス: クリック コマンドとリッチな出力が融合します。なぜなら、端末ですらスタイリッシュに見せたがるからです!
クリックすると、コマンドの管理、引数の解析、ヘルプの生成が簡素化されます。また、コマンドの構造化とオプションの処理も簡単になります。
Rich を使用すると、美しくフォーマットされた Markdown をターミナルに直接出力できるため、機能的なだけでなく視覚的にも魅力的な結果が得られます。
これら 2 つのライブラリと Python イントロスペクションを組み合わせることで、豊富で読みやすい形式で出力を表示しながら、コマンドを動的に検出して実行する対話型チャット機能を構築できます。 実際的な例については、StoryCraftr が同様のアプローチを使用して AI 主導の執筆ワークフローを合理化する方法をご覧ください: https://storycraftr.app.
チャット コマンドはセッションを初期化し、ユーザーが 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)
Python イントロスペクションを使用して、使用可能なコマンドを動的に検出し、実行します。ここで重要な部分の 1 つは、Click コマンドが装飾された関数であるということです。実際のロジックを実行するには、装飾されていない関数 (つまり、コールバック) を呼び出す必要があります。
イントロスペクションを使用してコマンドを動的に実行し、Click のデコレータを処理する方法は次のとおりです。
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)
ユーザーがチャットを通じて対話的に呼び出すことができる、プロジェクト モジュール内のサンプル コマンドをいくつか考えてみましょう。
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]")
対話型チャット システムを実行するには:
@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]")
セッションが開始されると、ユーザーは次のようなコマンドを入力できます:
python your_cli.py chat --project-path /path/to/project
出力は、Rich Markdown を使用して整形式で表示されます。
You: project init You: project create "Homepage"
コマンド管理用の Click、Markdown フォーマット用の Rich、および Python イントロスペクションを組み合わせることで、CLI 用の強力でインタラクティブなチャット システムを構築できます。このアプローチにより、出力をエレガントで読みやすい形式で表示しながら、コマンドを動的に検出して実行できます。
主なハイライト:
以上がイントロスペクション、クリック、リッチフォーマットを使用して Python CLI の対話型チャットを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。