خانه / آموزش‌ها / ساخت رابط خط فرمان (CLI) با ماژول cmd در پایتون

ساخت رابط خط فرمان (CLI) با ماژول cmd در پایتون

🐍 HomeOfPython
|
📅 1404/10/18

سطح مقدماتی (Beginner Level)

ماژول cmd در پایتون یک چارچوب (Framework) قدرتمند در کتابخانه استاندارد است که به شما اجازه می‌دهد برنامه‌های تعاملی خط فرمان (CLI) بنویسید. اگر می‌خواهید برنامه‌ای بسازید که منتظر دستور کاربر بماند (مانند bash یا sqlplus)، این ماژول بهترین گزینه است.

ساختار پایه و تعریف دستورات

برای استفاده از cmd، باید یک کلاس بسازید که از cmd.Cmd ارث‌بری می‌کند. هر متدی که با پیشوند do_ شروع شود، به یک دستور در برنامه شما تبدیل می‌شود.

مثال ۱: ساخت یک پوسته ساده

در این مثال، یک برنامه ساده می‌سازیم که دو دستور hello و exit را می‌شناسد.

Python

مثال ۲: مدیریت ورودی‌های مختلف

دستورات در cmd همیشه ورودی را به صورت رشته (string) دریافت می‌کنند. شما باید خودتان این رشته را پردازش کنید.

Python

سیستم راهنما (Help System)

ماژول cmd به صورت خودکار سیستم راهنما دارد. اگر کاربری تایپ کند help command، توضیحات مربوط به آن دستور نمایش داده می‌شود.

روش ۱: استفاده از Docstrings

ساده‌ترین راه، نوشتن توضیحات داخل تابع (Docstring) است.

python
# Static: نمایش نحوه تعریف Docstring که توسط help خوانده می‌شود
class MyShell(cmd.Cmd):
    def do_greet(self, arg):
        """
        Syntax: greet [name]
        این دستور به کاربر سلام می‌کند.
        """
        print("Hello")

روش ۲: تعریف متد help_*

اگر توضیحات طولانی و پیچیده دارید، می‌توانید یک متد جداگانه با پیشوند help_ بسازید.

Python

نمای کلی ساختار cmd

مدیریت خروج و EOF

بسیار مهم است که راهی برای خروج از برنامه برای کاربر فراهم کنید. معمولاً این کار با دستور exit یا فشردن Ctrl+D (که EOF نامیده می‌شود) انجام می‌شود.

Python

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، ماژول cmd امکانات قدرتمندی برای کنترل چرخه حیات دستورات، تکمیل خودکار (Tab Completion) و مدیریت خطاها ارائه می‌دهد.

چرخه‌های حیات (Hooks)

کلاس Cmd متدهایی دارد که قبل و بعد از اجرای هر دستور یا کل حلقه اجرا می‌شوند. این متدها برای لاگ‌برداری، اعتبارسنجی یا تغییر ورودی بسیار مفید هستند:

  • preloop(): یک بار قبل از شروع cmdloop اجرا می‌شود.
  • postloop(): یک بار بعد از پایان cmdloop اجرا می‌شود.
  • precmd(line): قبل از پردازش هر دستور اجرا می‌شود (می‌توانید دستور را تغییر دهید).
  • postcmd(stop, line): بعد از اجرای دستور اجرا می‌شود.

مثال: لاگ‌برداری و تغییر دستور

در این مثال، تمام دستورات را به حروف کوچک تبدیل می‌کنیم و لاگ می‌گیریم.

Python

مدیریت خطای دستورات و خط خالی

به طور پیش‌فرض، اگر کاربر دستوری وارد کند که وجود ندارد، پیام خطا چاپ می‌شود. همچنین اگر کاربر فقط Enter را بزند، آخرین دستور تکرار می‌شود. می‌توانیم این رفتارها را تغییر دهیم.

مثال ۱: تغییر رفتار default و emptyline

Python

تکمیل خودکار (Auto-completion)

یکی از حرفه‌ای‌ترین قابلیت‌های cmd، پشتیبانی از تکمیل خودکار با کلید Tab است (در سیستم‌هایی که readline پشتیبانی می‌شود). برای هر دستور do_foo، می‌توانید یک متد complete_foo بسازید.

منطق complete_*

این متد باید لیستی از پیشنهادها را برگرداند. آرگومان‌های ورودی عبارتند از:

  • text: متنی که کاربر در حال تایپ آن است.
  • line: کل خط دستور.
  • begidx و endidx: ایندکس شروع و پایان متن.

مثال: تکمیل خودکار نام کاربران

Python

دسترسی به پوسته سیستم (Shell)

گاهی لازم است کاربر بتواند دستورات سیستمی (مثل ls یا dir) را اجرا کند. مرسوم است که این کار با پیشوند ! انجام شود.

python
# Static: نیاز به ماژول os دارد و در محیط سندباکس ممکن است خطرناک باشد
import cmd
import os

class SystemShell(cmd.Cmd):
    def do_shell(self, line):
        """اجرای دستورات سیستم عامل با پیشوند !"""
        output = os.popen(line).read()
        print(output)

# کاربر می‌تواند تایپ کند: !ls -la

نکات فنی و Best Practice ها

  1. مدیریت آرگومان‌ها: همیشه فرض کنید ورودی کاربر "کثیف" است. از try-except یا ماژول argparse داخل متدهای do_ استفاده کنید.
  2. جدا کردن منطق از رابط: منطق اصلی برنامه (Business Logic) را در کلاس‌های جداگانه بنویسید و در متدهای do_ فقط آن‌ها را فراخوانی کنید.
  3. تغییر ظاهر: می‌توانید متغیر prompt را بر اساس وضعیت تغییر دهید (مثلاً نمایش دایرکتوری فعلی در پرامپت).
Python