از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ایجاد ابزارهای خط فرمان با argparse پایتون
سرفصلهای مطلب
معرفی
بیشتر نرمافزارهای کاربر با یک رابط بصری دلپذیر یا از طریق یک صفحه وب تزئین شده ارائه میشوند. در مواقع دیگر، یک برنامه می تواند آنقدر کوچک باشد که یک رابط کاربری گرافیکی کامل یا برنامه وب را تضمین نکند که عملکرد آن را در اختیار کاربر نهایی قرار دهد.
در این موارد می توانیم برنامه هایی بسازیم که از طریق 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