ساخت برنامه های خط فرمان در پایتون با بسته کلیک (Click Package) – به زبان ساده
یک بسته پایتون به نام Click وجود دارد که برای نوشتن رابطهای خط فرمان طراحی شده است. این بسته مستندات زیبایی برای شما ایجاد میکند و اجازه ساخت رابطهای خط فرمان حتی به کوچکی یک خط را فراهم میسازد. به طور خلاصه این بسته عملکردی فوقالعاده دارد و میتواند برنامههای شما را به سطحی بالاتر ارتقا بخشد. در این راهنما به شما نشان میدهیم چگونه میتوانید از Click برای حیات بخشیدن به پروژههای پایتون خود کمک بگیرید.
نوشتن برنامههای خط فرمان بدون Click
البته بدیهی است که نوشتن برنامههای خط فرمان بدون Click نیز میسر است؛ اما چنین کاری نیازمند تلاش زیاد و کدنویسی فراوان است. شما باید آرگومانهای خط فرمان را تحلیل کنید، اعتبارسنجی کنید، منطق مدیریت آرگومانهای مختلف را بنویسید و یک منوی help سفارشی بسازید. حتی اگر بخواهید گزینه جدیدی اضافه کنید، باید مجدداً راهنما (help) برنامه خود را بهروزرسانی نمایید.
البته نوشتن چنین کدی هیچ اشکالی ندارد و چنین کاری در وقع یک راه عالی برای یادگیری پایتون محسوب میشود، اما Click به شما امکان میدهد که کارها را بسیار سادهتر انجام دهید. بدون Click شما باید کدی بنویسید که احتمالاً ضعیف است و هر زمان که چیزی تغییر مییابد، نیازمند کلی تغییر خواهد بود. در ادامه یک رابط خط فرمان آمده است که بدون Click نوشته شده است:
import sys import random def do_work(): """ Function to handle command line usage""" args = sys.argv args = args[1:] # First element of args is the file name if len(args) == 0: print('You have not passed any commands in!') else: for a in args: if a == '--help': print('Basic command line program') print('Options:') print(' --help -> show this basic help menu.') print(' --monty -> show a Monty Python quote.') print(' --veg -> show a random vegetable') elif a == '--monty': print('What\'s this, then? "Romanes eunt domus"? People called Romanes, they go, the house?') elif a == '--veg': print(random.choice(['Carrot', 'Potato', 'Turnip'])) else: print('Unrecognised argument.') if __name__ == '__main__': do_work()
این 27 خط کد پایتون کاملاً به خوبی کار میکند؛ اما بسیار شکننده است. هر تغییری که در برنامه ایجاد شود باید کدهای پشتیبانی دیگر نیز تغییر یابند. اگر نام یک آرگومان تغییر یابد باید اطلاعات help نیز بهروزرسانی شوند. این کد به سادگی میتواند به چیزی تبدیل شود که کاملاً خارج از کنترل است. در ادامه کد فوق که با Click نوشته شده، آمده است:
import click import random @click.command() @click.option('--monty', default=False, help='Show a Monty Python quote.') @click.option('--veg', default=False, help='Show a random vegetable.') def do_work(monty, veg): """ Basic Click example will follow your commands""" if monty: print('What\'s this, then? "Romanes eunt domus"? People called Romanes, they go, the house?') if veg: print(random.choice(['Carrot', 'Potato', 'Turnip'])) if __name__ == '__main__': do_work()
این مثال Click، همان منطق کد 16 خطی قبلی را پیادهسازی میکند. آرگومانها برای شما تجزیه شدهاند و صفحه help نیز ایجاد شده است:
مقایسهای مقدماتی نشان میدهد که استفاده از برنامههایی مانند Click تا چه میزان در زمان و تلاش صرفهجویی میکنند. با این که رابط خط فرمان ممکن است برای کاربر نهایی یکسان به نظر برسد؛ اما کدی که در پشت صحنه عمل میکند بسیار سادهتر است و زمان زیادی نیز برای کدنویسی صرفهجویی شده است. هر گونه تغییر یا بهروزرسانی که در آینده ممکن است ایجاد شود نیز به زمان بسیار کمی نیاز خواهد داشت.
آغاز کار با Click برای پایتون
پیش از آن که با Click کار کنید باید یک محیط مجازی پایتون ایجاد کنید. بدین ترتیب از تداخل بستههای پایتون با پایتون سیستم یا دیگر پروژهها که ممکن است مشغول کار باشید، جلوگیری میشود. همچنین اگر میخواهید صرفاً با پایتون و Click آشنا شوید، شاید بخواهید از ابزارهای پایتون در مرورگر مانند «pythonanywhere» استفاده کنید.
در نهایت مطمئن شوید که از نسخه پایتون استفاده میکنید. امکان استفاده از Click در نسخه 2 پایتون نیز وجود دارد؛ اما نمونههایی که در این نوشته ارائه میشوند در پایتون 3 هستند. زمانی که آماده بودید Click را با استفاده از PIP نصب کنید:
pip install click
نوشتن نخستین برنامه Click
در یک ویرایشگر متنی ابتدا Click را ایمپورت میکنیم:
import click
زمانی که ایمپورت کردید یک متد و یک نقطه ورود main ایجاد کنید. بدین ترتیب روشی برای نوشتن کد و نقطهای برای شروع به کار پایتون تعیین میکنیم:
import click import random def veg(): """ Basic method will return a random vegetable""" print(random.choice(['Carrot', 'Potato', 'Turnip', 'Parsnip'])) if __name__ == '__main__': veg()
این اسکریپت بسیار ساده نام یک سبزی را به صورت تصادفی در خروجی نمایش میدهد. کد شما ممکن است ظاهر متفاوتی داشته باشد، اما این کد ساده راهحل خوبی برای آشنایی با Click است. این برنامه را با نام click_example.py ذخیره کنید و پس از مراجعه به دایرکتوری مربوطه آن را در خط فرمان اجرا کنید:
python click_example.py
در خروجی نام یک سبزی را به صورت تصادفی خواهید دید. اینک با افزودن Click همه چیز را بهبود میبخشیم. کد خود را طوری تغییر دهید که شامل دکوراتورهای Click و یک حلقه for باشد:
@click.command() @click.option('--total', default=3, help='Number of vegetables to output.') def veg(total): """ Basic method will return a random vegetable""" for number in range(total): print(random.choice(['Carrot', 'Potato', 'Turnip', 'Parsnip'])) if __name__ == '__main__': veg()
پس از اجرا میبینید که نام یک سبزی به صورت تصادفی سه بار نمایش مییابد.
بررسی کد Click
اینک تغییرات مورد نظر را بررسی میکنیم. دکوراتور ()click.command@ باعث میشود Click طوری پیکربندی شود که با تابع بیدرنگ پس از دکوراتور کار بکند. در این مورد این تابع ()veg نام دارد. این کار برای هر متدی که قرار است با Click کار کند، ضروری محسوب میشود.
دکوراتور click.option@ کلیک را طوری پیکربندی میکند که پارامترهای را از خط فرمان بپذیرد و آن را به متد شما بفرستد. سه آرگومان در این جا استفاده شدهاند:
- total- – این نام خط فرمان برای آرگومان total است.
- Default – اگر آرگومان total ذکر نشده باشد، Click هنگام استفاده از اسکریپت شما از این مقدار پیشفرض استفاده خواهد کرد.
- Help – یک جمله کوتاه که شیوه استفاده از برنامه را توضیح میدهد.
اینک کارکرد Click را در عمل بررسی میکنیم. در خط فرمان اسکریپت خود را اجرا میکنیم. اما آرگومان total را به صورت زیر ارسال میکنیم:
python click_example.py --total 10
با تعیین total 10- در خط فرمان، این اسکریپت به صورت تصادفی نام یک سبزی را نمایش میدهد. اگر فلگ help- ارسال شود صفحه help به همراه گزینههایی که میتوان استفاده کرد، نمایش مییابد:
python click_example.py –help
افزودن دستورات بیشتر
امکان استفاده از دکوراتورهای مختلف کلیک روی تابع یکسان وجود دارد. افزودن گزینه Click دیگر به تابع veg این گونه است:
@click.option('--gravy', default=False, help='Append "with gravy" to the vegetables.')
فراموش نکنید که این را به متد نیز ارسال کنید:
def veg(total, gravy):
اینک زمانی که فایل خود را اجرا کنید میتوانید فلگ gravy را نیز ارسال کنید:
python click_example.py --gravy y
میبینید که صفحه help نیز تغییر یافته است.
اکنون کد کامل به صورت زیر است. البته مقدار بازسازی روی کد صورت گرفته تا خوانایی افزایش یابد:
import click import random @click.command() @click.option('--gravy', default=False, help='Append "with gravy" to the vegetables.') @click.option('--total', default=3, help='Number of vegetables to output.') def veg(total, gravy): """ Basic method will return a random vegetable""" for number in range(total): choice = random.choice(['Carrot', 'Potato', 'Turnip', 'Parsnip']) if gravy: print(f'{choice} with gravy') else: print(choice) if __name__ == '__main__': veg()
گزینههای بیشتر برای Click
زمانی که با مقدمات کار آشنا شدید، میتوانید شروع به استفاده از گزینههای پیشرفتهتر Click بکنید. در مثال زیر یاد میگیرید که چگونه چند مقدار را به یک آرگومان واحد ارسال کنید که Click آنها را به صورت یک چندتایی در میآورد. یک فایل جدید به نام click_example_2.py ایجاد کنید. کد آغازین آن این گونه است:
import click import random @click.command() def add(): """ Basic method will add two numbers together.""" pass if __name__ == '__main__': add()
هیچ چیز جدیدی در این بخش وجود ندارد. در بخش قبلی این کد را به تفصیل توضیح دادهایم. اینک یک گزینه click.option@ به نام numbers اضافه کنید:
@click.option('--numbers', nargs=2, type=int, help='Add two numbers together.')
تنها کد جدید در این بخش گزینههای nargs=2 و type=int هستند. این گزینهها به Click میگویند که دو مقدار برای گزینه numbers بپذیرد و این که باید هر دو آنها از نوع integer باشند. شما میتوانید این عدد و نوع داده (معتبر) برای آن را به هر مقدار که دوست دارید تغییر دهید. در نهایت متد add برای پذیرش آرگومان numbers تغییر مییابد و مقداری پردازش روی آنها صورت میگیرد:
def add(numbers): """ Basic method will add two numbers together.""" result = numbers[0] + numbers[1] print(f'{numbers[0]} + {numbers[1]} = {result}')
هر مقدار که ارسال میکنید از طریق شیء numbers قابل دسترسی است. شیوه استفاده از آن در خط فرمان چنین است:
python click_example_2.py --numbers 1 2
Click راهحلی برای برنامههای کاربردی پایتون است.
هان طور که در این نوشته دیدید Click با این که استفاده آسانی دارد؛ اما ابزار بسیار قدرتمندی محسوب میشود. با مثالهایی که ارائه شدند برخی جنبههای مقدماتی Click را توضیح دادیم. البته Click ویژگیهای زیادی دارد که باید در مورد آنها بیاموزید و این کار اکنون که با مقدمات آشنا شدید بسیار راحتتر خواهد بود.
اگر این نوشته مورد توجهتان قرار گرفته است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- آموزش برنامه نویسی پایتون – مقدماتی
- مجموعه آموزشهای برنامه نویسی پایتون
- آموزش الگوهای طراحی (Design Patterns) در پایتون (Python)
- پنج دلیل برای کاربردی بودن زبان پایتون
- نصب PIP پایتون بر روی ویندوز، مک و لینوکس — از صفر تا صد
- مجموعه آموزشهای برنامهنویسی
==