سطح مقدماتی (Beginner Level)
ماژول cmd در پایتون یک چارچوب (Framework) قدرتمند در کتابخانه استاندارد است که به شما اجازه میدهد برنامههای تعاملی خط فرمان (CLI) بنویسید. اگر میخواهید برنامهای بسازید که منتظر دستور کاربر بماند (مانند bash یا sqlplus)، این ماژول بهترین گزینه است.
ساختار پایه و تعریف دستورات
برای استفاده از cmd، باید یک کلاس بسازید که از cmd.Cmd ارثبری میکند. هر متدی که با پیشوند do_ شروع شود، به یک دستور در برنامه شما تبدیل میشود.
مثال ۱: ساخت یک پوسته ساده
در این مثال، یک برنامه ساده میسازیم که دو دستور hello و exit را میشناسد.
مثال ۲: مدیریت ورودیهای مختلف
دستورات در cmd همیشه ورودی را به صورت رشته (string) دریافت میکنند. شما باید خودتان این رشته را پردازش کنید.
سیستم راهنما (Help System)
ماژول cmd به صورت خودکار سیستم راهنما دارد. اگر کاربری تایپ کند help command، توضیحات مربوط به آن دستور نمایش داده میشود.
روش ۱: استفاده از Docstrings
سادهترین راه، نوشتن توضیحات داخل تابع (Docstring) است.
# Static: نمایش نحوه تعریف Docstring که توسط help خوانده میشود
class MyShell(cmd.Cmd):
def do_greet(self, arg):
"""
Syntax: greet [name]
این دستور به کاربر سلام میکند.
"""
print("Hello")
روش ۲: تعریف متد help_*
اگر توضیحات طولانی و پیچیده دارید، میتوانید یک متد جداگانه با پیشوند help_ بسازید.

مدیریت خروج و EOF
بسیار مهم است که راهی برای خروج از برنامه برای کاربر فراهم کنید. معمولاً این کار با دستور exit یا فشردن Ctrl+D (که EOF نامیده میشود) انجام میشود.
سطح پیشرفته (Professional Level)
در سطح حرفهای، ماژول cmd امکانات قدرتمندی برای کنترل چرخه حیات دستورات، تکمیل خودکار (Tab Completion) و مدیریت خطاها ارائه میدهد.
چرخههای حیات (Hooks)
کلاس Cmd متدهایی دارد که قبل و بعد از اجرای هر دستور یا کل حلقه اجرا میشوند. این متدها برای لاگبرداری، اعتبارسنجی یا تغییر ورودی بسیار مفید هستند:
preloop(): یک بار قبل از شروعcmdloopاجرا میشود.postloop(): یک بار بعد از پایانcmdloopاجرا میشود.precmd(line): قبل از پردازش هر دستور اجرا میشود (میتوانید دستور را تغییر دهید).postcmd(stop, line): بعد از اجرای دستور اجرا میشود.
مثال: لاگبرداری و تغییر دستور
در این مثال، تمام دستورات را به حروف کوچک تبدیل میکنیم و لاگ میگیریم.
مدیریت خطای دستورات و خط خالی
به طور پیشفرض، اگر کاربر دستوری وارد کند که وجود ندارد، پیام خطا چاپ میشود. همچنین اگر کاربر فقط Enter را بزند، آخرین دستور تکرار میشود. میتوانیم این رفتارها را تغییر دهیم.
مثال ۱: تغییر رفتار default و emptyline
تکمیل خودکار (Auto-completion)
یکی از حرفهایترین قابلیتهای cmd، پشتیبانی از تکمیل خودکار با کلید Tab است (در سیستمهایی که readline پشتیبانی میشود). برای هر دستور do_foo، میتوانید یک متد complete_foo بسازید.
منطق complete_*
این متد باید لیستی از پیشنهادها را برگرداند. آرگومانهای ورودی عبارتند از:
text: متنی که کاربر در حال تایپ آن است.line: کل خط دستور.begidxوendidx: ایندکس شروع و پایان متن.
مثال: تکمیل خودکار نام کاربران
دسترسی به پوسته سیستم (Shell)
گاهی لازم است کاربر بتواند دستورات سیستمی (مثل ls یا dir) را اجرا کند. مرسوم است که این کار با پیشوند ! انجام شود.
# 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 ها
- مدیریت آرگومانها: همیشه فرض کنید ورودی کاربر "کثیف" است. از
try-exceptیا ماژولargparseداخل متدهایdo_استفاده کنید. - جدا کردن منطق از رابط: منطق اصلی برنامه (Business Logic) را در کلاسهای جداگانه بنویسید و در متدهای
do_فقط آنها را فراخوانی کنید. - تغییر ظاهر: میتوانید متغیر
promptرا بر اساس وضعیت تغییر دهید (مثلاً نمایش دایرکتوری فعلی در پرامپت).