«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как создать интерактивный чат для вашего CLI Python, используя самоанализ, клик и расширенное форматирование

Как создать интерактивный чат для вашего CLI Python, используя самоанализ, клик и расширенное форматирование

Опубликовано 8 ноября 2024 г.
Просматривать:448

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

Если вы когда-нибудь хотели сделать свой интерфейс командной строки более интерактивным и динамичным, решением может стать создание системы взаимодействия с командами в реальном времени. Используя возможности самоанализа Python, Click для управления командами и Rich для форматирования вывода, вы можете создать мощный и гибкий интерфейс командной строки, который интеллектуально реагирует на ввод пользователя. Вместо того, чтобы вручную жестко кодировать каждую команду, ваш интерфейс командной строки может автоматически обнаруживать и выполнять команды, что делает работу пользователя более плавной и увлекательной.

Красочный хаос консоли: где команды Click сочетаются с насыщенным выводом, потому что даже терминал любит хвастаться стилем!

Зачем использовать Click и Markdown?

Click упрощает управление командами, анализ аргументов и создание справки. Это также позволяет легко структурировать команды и обрабатывать параметры.

Rich позволяет выводить Markdown в красивом формате прямо в терминал, делая результаты не только функциональными, но и визуально привлекательными.

Объединив эти две библиотеки с самоанализом Python, вы можете создать функцию интерактивного чата, которая динамически обнаруживает и выполняет команды, отображая выходные данные в удобном для чтения формате. В качестве практического примера посмотрите, как StoryCraftr использует аналогичный подход для оптимизации рабочих процессов написания текстов на основе искусственного интеллекта: https://storycraftr.app.

Создание системы интерактивного чата

1. Настройка основной команды чата

Команда чата инициализирует сеанс, позволяя пользователям взаимодействовать с 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)

2. Самоанализ для обнаружения и выполнения команд

Используя самоанализ 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]")

Как это работает?

  • Разбор входных данных: мы используем shlex.split для обработки входных данных как аргументов командной строки. Это гарантирует правильную обработку строк в кавычках и специальных символов.
  • Поиск модуля и команды: входные данные делятся на имя_модуля и имя_команды. Имя команды обрабатывается для замены дефисов на подчеркивания в соответствии с именами функций Python.
  • Интроспекция: мы используем 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 для управления командами, Rich для форматирования Markdown и самоанализ Python, мы можем создать мощную и интерактивную систему чата для CLI. Этот подход позволяет вам динамически обнаруживать и выполнять команды, представляя вывод в элегантном, читаемом формате.

Основные моменты:

  • Динамическое выполнение команд: самоанализ позволяет обнаруживать и запускать команды без их жесткого кодирования.
  • Расширенный вывод: использование Rich Markdown обеспечивает легкость чтения и визуально привлекательный результат.
  • Гибкость: эта настройка обеспечивает гибкость в структуре команд и их выполнении.
Заявление о выпуске Эта статья воспроизведена по адресу: 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], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3