Если вы когда-нибудь хотели сделать свой интерфейс командной строки более интерактивным и динамичным, решением может стать создание системы взаимодействия с командами в реальном времени. Используя возможности самоанализа Python, Click для управления командами и Rich для форматирования вывода, вы можете создать мощный и гибкий интерфейс командной строки, который интеллектуально реагирует на ввод пользователя. Вместо того, чтобы вручную жестко кодировать каждую команду, ваш интерфейс командной строки может автоматически обнаруживать и выполнять команды, что делает работу пользователя более плавной и увлекательной.
Красочный хаос консоли: где команды Click сочетаются с насыщенным выводом, потому что даже терминал любит хвастаться стилем!
Click упрощает управление командами, анализ аргументов и создание справки. Это также позволяет легко структурировать команды и обрабатывать параметры.
Rich позволяет выводить Markdown в красивом формате прямо в терминал, делая результаты не только функциональными, но и визуально привлекательными.
Объединив эти две библиотеки с самоанализом Python, вы можете создать функцию интерактивного чата, которая динамически обнаруживает и выполняет команды, отображая выходные данные в удобном для чтения формате. В качестве практического примера посмотрите, как StoryCraftr использует аналогичный подход для оптимизации рабочих процессов написания текстов на основе искусственного интеллекта: https://storycraftr.app.
Команда чата инициализирует сеанс, позволяя пользователям взаимодействовать с CLI. Здесь мы фиксируем ввод пользователя, который будет динамически сопоставлен с соответствующими командами 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)
Используя самоанализ Python, мы динамически обнаруживаем доступные команды и выполняем их. Важным моментом здесь является то, что команды 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]")
Давайте рассмотрим несколько примеров команд в модуле проекта, которые пользователи могут вызывать в интерактивном режиме через чат:
@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
После запуска сеанса пользователи могут вводить такие команды, как:
You: project init You: project create "Homepage"
Вывод будет отображаться в правильном формате с использованием Rich Markdown:
[bold green]Project initialized![/bold green] [bold cyan]Component Homepage created.[/bold cyan]
Комбинируя Click для управления командами, Rich для форматирования Markdown и самоанализ Python, мы можем создать мощную и интерактивную систему чата для CLI. Этот подход позволяет вам динамически обнаруживать и выполнять команды, представляя вывод в элегантном, читаемом формате.
Основные моменты:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3