وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

ایجاد ابزارهای خط فرمان با argparse پایتون

0 48
زمان لازم برای مطالعه: 7 دقیقه


معرفی

بیشتر نرم‌افزارهای کاربر با یک رابط بصری دلپذیر یا از طریق یک صفحه وب تزئین شده ارائه می‌شوند. در مواقع دیگر، یک برنامه می تواند آنقدر کوچک باشد که یک رابط کاربری گرافیکی کامل یا برنامه وب را تضمین نکند که عملکرد آن را در اختیار کاربر نهایی قرار دهد.

در این موارد می توانیم برنامه هایی بسازیم که از طریق a قابل دسترسی هستند رابط خط فرمان، یا CLI.

در این پست به بررسی پایتون می پردازیم argparse ماژول و استفاده از آن برای ساخت یک ساده command-line ابزاری برای کمک به ما برای کوتاه کردن سریع URL ها.

رابط خط فرمان

آ رابط خط فرمان یک رابط کاربری مبتنی بر متن است که ابزاری برای تعامل با رایانه از طریق دستورات متنی فراهم می کند. برنامه ای که این تعامل را با افشای رابط تسهیل می کند به عنوان a شناخته می شود command-line مترجم یا الف پوسته.

دستورات را در قالب ورودی متن می گیرد، برنامه ها را بر اساس اجرا می کند روی ورودی ارائه شده، سپس خروجی را نمایش می دهد روی واسط. پوسته های زیادی در دسترس هستند که اولین آن ها محبوب هستند پوسته بورن و پوسته C برای سیستم های مبتنی بر یونیکس این Bourne Again Shell (موسوم به bash) یک پسوند بسیار محبوب Bourne Shell است، در کنار آن KornShell (ksh).

همچنین شایان ذکر است که CLI ها مانند سایر نرم افزارها برای کار با آنها نیاز به حساب های کاربری دارند. سیستم مجوزها را اجرا می کند روی این کاربران برای کمک به کنترل سطح دسترسی و محدودیت آنچه یک کاربر می تواند با سیستم به دست آورد. این تمایز لازم است زیرا پوسته یک رابط بین کاربر و هسته سیستم عامل است که تمام عملیات رایانه را کنترل می کند. دسترسی به این قابلیت باید محدود شود تا از استفاده مخرب از آن جلوگیری شود command-line رابط.

CLI ها یک اعلان ارائه می دهند که معمولاً علامت دلار است ($) که نشان می دهد که می توانید دستور خود را وارد کنید. با این حال، این اعلان همچنین نشان می دهد که دستور وارد شده بدون انجام خواهد شد root دسترسی داشته باشید.

چه زمانی root دسترسی به کاربر فعلی در تعامل با CLI داده می شود، اعلان به یک علامت هش تغییر می کند (#).

در حالی که رابط های گرافیکی کاربر (GUI) یادگیری آسان‌تر و بصری‌تر است، CLI به کاربران اجازه می‌دهد تا با نرم‌افزار تنها با استفاده از صفحه‌کلید تعامل داشته باشند که می‌تواند عملکرد سریع‌تری داشته باشد. CLI ها همچنین در مقایسه با رابط کاربری گرافیکی از منابع کامپیوتری کمتری استفاده می کنند و آنها را سبک تر و سریع تر می کند.

اسکریپت

اکثر command-line مفسرها با برخی از دستورات اساسی ارسال می شوند که همه آنها می توانند از طریق فراخوانی شوند command-line رابط برای انجام وظایف خاص. برخی از موارد رایج عبارتند از:

  • uptime: نشان می دهد که کامپیوتر چقدر کار کرده است روی
  • date: تاریخ و زمان فعلی را برمی گرداند
  • ls: لیستی از تمام فایل ها و پوشه های یک فهرست را برمی گرداند
  • cd: برای انتقال از یک دایرکتوری به پوشه دیگر استفاده می شود
  • pwd: برای نمایش دایرکتوری کاری فعلی استفاده می شود
  • man: برای نمایش دفترچه راهنما یا دستورالعمل های هر دستوری استفاده می شود
  • touch: برای ایجاد فایل های جدید و خالی استفاده می شود
  • mkdir: برای ایجاد دایرکتوری های جدید استفاده می شود

پوسته اسکریپت برنامه ای است که برای اجرا توسط a command-line مترجم این شامل یک سری دستورات است، مانند موارد ذکر شده در بالا، همراه با متغیرها و شرایطی که به پوسته دستور می دهند. روی چه کار یا وظایفی را به عهده بگیرد.

از طریق اسکریپت های پوسته، یک کاربر می تواند چندین دستور را پشت سر هم و بدون نیاز به به خاطر سپردن همه آنها انجام دهد. آنها بیشتر برای دستیابی به عملیات های تکراری بدون ورود تکراری دستورات استفاده می شوند، بنابراین، تلاش مورد نیاز کاربر نهایی را کاهش می دهند.

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

پیشنهاد می‌کنیم بخوانید:  هیچ ماژولی با نام رمزگذاری" در پایتون وجود ندارد

چیست آرگپارس?

یک اسکریپت پوسته پایتون فقط یک برنامه عادی پایتون است که توسط آن اجرا می شود command-line مترجم هنگام اجرای یک اسکریپت پوسته، آرگومان ها از طریق اسکریپت ما ارسال می شوند sys.argv. این متغیر لیستی از آرگومان های ارسال شده به برنامه ما است، از جمله نام اسکریپت که اولین آرگومان نیز می باشد.

به طور معمول، ما می توانیم یک اسکریپت ساده بنویسیم که به هیچ آرگومان اضافی نیاز ندارد، مانند یک اسکریپت ساده برای نمایش تاریخ فعلی. با این حال، این کارکردی را که می توانیم ارائه دهیم محدود می کند. برای اینکه اسکریپت‌های ما همه‌کاره‌تر شوند و دامنه استفاده از آن‌ها بیشتر شود، باید سفارشی‌سازی را از طریق آرگومان‌هایی که به کاربر کنترل و گزینه‌های بیشتری از نظر عملکرد می‌دهد، تسهیل کنیم.

این argparse ماژول به ما کمک می کند تا آرگومان های ارسال شده با اسکریپت و را تجزیه کنیم process آنها را به روشی راحت تر همچنین ویژگی های سفارشی سازی مانند نام گذاری برنامه ما و اضافه کردن توضیحات به روشی ساده تر را اضافه می کند.

argparse همچنین ابزاری را برای ما فراهم می‌کند تا دستورالعمل‌های استفاده را برای اسکریپت خود سفارشی کنیم و مشخص کنیم کدام آرگومان‌ها مورد نیاز هستند و کدام‌ها اختیاری هستند. برای بررسی همه این ویژگی‌ها و موارد دیگر، ما ابزار Python CLI خود را در بخش بعدی می‌سازیم.

برنامه آزمایشی

در حال حاضر اگر بخواهیم یک URL را کوتاه کنیم، باید یک مرورگر را فعال کنیم و به یک سایت کوتاه کننده URL بروید تا کار را انجام دهیم. هدف ما تسریع و تقویت این کوتاه شدن URL است process از طریق یک اسکریپت که ما می توانیم در هر زمان آن را فعال کنیم روی ما terminal. ما فقط باید URL هایی را که باید کوتاه کنیم به عنوان آرگومان ارسال کنیم و URL های کوتاه شده را در پاسخ دریافت کنیم.

برای این نسخه ی نمایشی، ما استفاده خواهیم کرد Shorte.st به عنوان ارائه دهنده ما، زیرا API آن ساده و سرراست است.

پس از ایجاد یک حساب کاربری، می توانیم به آن مراجعه کنیم ابزار پیوند بخش و انتخاب کنید Developers API. در اینجا ما نشانه دسترسی و آدرس اینترنتی را که اسکریپت ما برای کوتاه کردن URL هایمان استفاده می کند، پیدا می کنیم.

هنگامی که کاربر یک URL به ابزار خط فرمان ما ارائه کرد تا کوتاه شود، ما URL را به آن ارسال می کنیم Shorte.st API نقطه پایانی همراه با رمز دسترسی ما. پاسخ URL کوتاه شده ما و یک پیام وضعیت خواهد بود.

اجازه دهید با ایجاد یک محیط مجازی و نصب ماژول درخواست ها شروع کنیم که از آن برای ارسال درخواست های HTTP به API استفاده می کنیم:

$ mkdir pyshortener && cd pyshortener
$ virtualenv --python=python3 env --no-site-packages
$ source env/bin/activate
$ pip install requests

در خط اول بالا، ما در واقع دو دستور را با استفاده از آمپرسند دوگانه (&&). این به ما اجازه می دهد تا دستورات را به ترتیب اجرا کنیم، مگر اینکه دستور اول شکست بخورد، که سپس از اجرای دستور دوم جلوگیری می کند.

پس از ایجاد محیط مجازی و فعال سازی آن، وابستگی پایتون خود را نصب می کنیم.

برای این نسخه نمایشی ابتدا تابع کوتاه کردن خود را می سازیم و سپس عملکرد آن را با استفاده از آن بسته بندی می کنیم argparse در فیلمنامه نهایی:

import requests
from requests.exceptions import ConnectionError
import json

def shorten_url(url):
    try:
        response = requests.put("https://api.shorte.st/v1/data/url",
                                {"urlToShorten": url},
                                headers={"public-api-token": "(MY-API-TOKEN)"})

        api_response = json.loads(response.content)

        return {"status": api_response('status'),
                "shortenedUrl": api_response('shortenedUrl'),
                "message": "URL shortened successfully"}

    except ConnectionError:
        return {"status": "error",
                "shortenedUrl": None,
                "message": "Please ensure you are connected to the internet and try again."}

shorten_url(www.rasanegar.com)

تابع ما URL را دریافت می کند و آن را به Shorte.st API می فرستد و URL کوتاه شده را برمی گرداند. کوتاه کنیم www.rasanegar.com با اجرای اسکریپت ما:

$ python pyshortener.py
{'status': 'ok', 'shortenedUrl': 'http://gestyy.com/w6ph2J', 'message': 'URL shortened successfully'}

همانطور که می بینیم، عملکرد ما کار می کند اما خروجی کمتر از ایده آل است. همچنین باید URL را در خود اسکریپت کدگذاری کنیم که ورودی و خروجی ثابتی به ما می دهد.

ما قصد داریم این را یک گام جلوتر برداریم و به کاربران اجازه دهیم هنگام اجرای اسکریپت URL را به عنوان آرگومان ارسال کنند. برای انجام این کار اکنون به معرفی خواهیم پرداخت argparse برای کمک به تجزیه آرگومان های ارائه شده توسط کاربر:

import requests
from requests.exceptions import ConnectionError
import json
import argparse 

def shorten_url(url):
    


parser = argparse.ArgumentParser(description='Shorten URLs روی the terminal')


parser.add_argument('--url', default="google.com", help="The URL to be shortened")
args = vars(parser.parse_args())
print(args)

در این نسخه از فیلمنامه، ما تماس نمی گیریم shorten_url، اما در عوض فقط print آرگومان های گرفته شده و تجزیه شده توسط argparse.

ما با ایجاد یک شروع می کنیم ArgumentParser با استفاده از شی argparse، که تمام اطلاعات مورد نیاز برای تبدیل آرگومان های ارسال شده به انواع داده پایتون را که می توانیم با آنها کار کنیم را در خود نگه می دارد.

پیشنهاد می‌کنیم بخوانید:  نحوه خودکارسازی صادرات داده ها و گزارش های ایمیل با پایتون - راهنمای گام به گام

پس از ایجاد تجزیه کننده، اکنون می توانیم با استفاده از آرگومان ها اضافه کنیم parser.add_argument(). این تابع اجازه می دهد تا اطلاعات زیر را در مورد آرگومان های خود مشخص کنیم:

  • اولین آرگومان یک نام یا پرچمی است که برای شناسایی آرگومان های ما استفاده می شود. آرگومان های اختیاری توسط - پیشوند، در مورد ما --url یک آرگومان اختیاری است.
  • این default گزینه اجازه می دهد تا زمانی که کاربر آرگومان را ارائه نکرده است، یک مقدار پیش فرض را تعیین کنید.
  • این help گزینه به طور خلاصه توضیح می دهد که استدلال چیست.
  • ما همچنین می توانیم استفاده کنیم choice گزینه ای برای تعیین مقادیر مجاز برای یک آرگومان، مانند yes و no.
  • از طریق الف type گزینه ما همچنین می توانیم نوع تبدیل دستور ما را مشخص کنیم، به عنوان مثال تبدیل آرگومان ها به اعداد صحیح.

وقتی اسکریپت خود را بدون ارائه هیچ آرگومان اجرا می کنیم، URL به طور پیش فرض روی “google.com” است، درست همانطور که در add_argument روش:

$ python pyshortener.py
{'url': 'google.com'}

حالا وقتی عبور می کنیم www.rasanegar.com با استفاده از --url flag، آن را به عنوان مقدار به تنظیم شده است url کلید:

$ python pyshortener.py --url www.rasanegar.com
{'url': 'www.rasanegar.com'}

اکنون می‌توانیم URL یک کاربر را از طریق خط فرمان دریافت کنیم و با تغییر اسکریپت آن را کوتاه کنیم:

if args.get('url'):
   print(shorten_url(args('url')))

وقتی آن را اجرا می کنیم و یک URL ارسال می کنیم، باید خروجی را از Shorte.st API دریافت کنیم:

$ python pyshortener.py --url rasanegar.com
{'status': 'ok', 'shortenedUrl': 'http://gestyy.com/w6pk2R', 'message': 'URL shortened successfully'}

اگرچه خروجی ما آنطور که می‌خواهیم دوستانه نیست، بنابراین اجازه دهید تابعی ایجاد کنیم تا خروجی خود را به شیوه‌ای مطلوب‌تر قالب‌بندی کنیم:

def handle_output(result):
   """ Function to format and print the output
   """
   if result("status") == "ok":
       print(f"{result('message')}. Your shortened URL is:\n"
             f"\t{result('shortenedUrl')}")
   elif result("status") == "error":
       print(f"{result('message')}")


args = vars(parser.parse_args())

if args.get('url'):
   result = shorten_url(args('url'))
   handle_output(result)

وقتی اسکریپت خود را یک بار دیگر اجرا می کنیم:

$ python pyshortener.py --url www.rasanegar.com
URL shortened successfully. Your shortened URL is:
        http://gestyy.com/w6pk2R

خروجی ما در حال حاضر کاربرپسندتر به دلیل اضافه شدن این است handle_output() تابع. برای اینکه ببینیم چطور argparse متن راهنما را برای اسکریپت ما ایجاد کرده است، ما می توانیم اسکریپت خود را با آن اجرا کنیم -h پرچم گذاری کنید تا متن راهنما به صورت زیر نمایش داده شود:

$ python pyshortener.py -h
usage: pyshortener.py (-h) (--url URL)

Shorten URLs روی the terminal

optional arguments:
  -h, --help  show this help message and exit
  --url URL   The URL to be shortened

نتیجه

ما یک پوسته اسکریپت با استفاده از پایتون ساخته‌ایم تا به ما کمک کند URL‌ها را به سرعت کوتاه کنیم روی را terminal. ما استفاده کرده ایم argparse ماژول برای تجزیه آرگومان هایی که به اسکریپت ما ارسال می شوند و حتی یک مقدار پیش فرض را در صورت ارائه آرگومان تعریف می کند.

اسکریپت ما اکنون همچنین دارای یک پیام راهنما زیبا است که می تواند با استفاده از آن نمایش داده شود -h پرچمی که توسط argparse ماژول به این معنی که ما مجبور نیستیم آن را به صورت دستی یادداشت کنیم.

گام بعدی تقویت اسکریپت ما برای پذیرش لیستی از URL ها یا خواندن URL ها از یک فایل متنی برای تسهیل کوتاه کردن دسته ای URL ها است.

کد منبع اسکریپت در این پروژه را می توان یافت اینجا روی GitHub.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-19 04:54:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید