خیلی وقت ها دیدم که مبتدی ها بلافاصله بعد از یادگیری پایتون، شروع می کنن به ساخت script های کوچک (که البته شروع خوبی هم هست) چون پیچیدگی خاصی ندارند. من هم از این نوع script ها زیاد میسازم. هرچند هیچ کدوم مفت نمی ارزند. ولی به هر حال از ساخت script ها یه سری تجربیاتی کسب کردم که باعث شد script هام کم کم نسبت به قبل بهتر بشن. توی این پست 4 نکته اساسی که بر حسب تجربه کسب کردم رو باهاتون به اشتراک بزارم. امیدوارم مفید باشند.
همیشه توی اکثر فایل های README گیتهاب مبتدی ها می بینم که نوشته اند: وارد فلان فولدر بشید، بعد وارد اون یکی فولدر بشید و ... آخرش هم فایل رو اجرا کنید.
واقعا چرا فکر می کنید کاربر خودش رو این همه به دردسر میندازه تا فایل script شما رو اجرا کنه؟؟اصلا هدف از ساختن script سرعت بخشیدن به کار های روزمره است نه طولانی تر کردن اونها. پس باید script تون رو طوری بسازید که قابلیت نصب داشته باشه. اینطوری کاربر می تونه ظرف چند ثانیه، از هرکجای سیستم script رو اجرا کنه. اما سوال اساسی اینجاست که چطور این کار رو بکنیم!؟
فقط کافیه یک فایل setup در کنار فایل script تون داشته باشید، محتوای اون هم زیاد پیچیده نیست. این نمونه ای از فایل setup هست: (با درنظر گرفتن حداقل تنظیمات و اطلاعات)
from distutils.core import setup setup ( name='name of project', version='1.0', scripts=["your_script.py"] )
حالا اینها رو در فایل setup.py وارد کنید، و دستور python setup.py install رو بزنید و تمام! اسکریپت نصب شد! حال می تونید از هرجای سیستم که باشید script رو اجرا کنید و دیگه لازم نیست به پوشه خود script مراجعه کنید.
برای اطلاعات بیشتر می تونید به documentation خود پایتون مراجعه کنید.
خوب بالاخره ممکنه script شما از یه سری پکیج هایی استفاده کنه که به صورت پیش فرض در کامپیوتر کاربر نصب نیستند. کاربر که نمی تونه کلی وقت بزاره و ImportError های پایتون رو بخونه و تک تک پکیج ها رو نصب کنه. پس حتما باید dependency (وابستگی) های script شما ذکر بشه.
بهترین راه برای اینکه dependency های پروژه رو نصب کنید داشتن یک فایل requirements.txt است. توی این فایل همه پکیج ها رو می نویسید و با دستور pip install -r requirements.txt می تونید همه رو یک جا نصب کنید (وقتی تعداد پکیج ها زیاده، این دستور کوتاه خیلی مشکل گشاست)
نکته: همیشه نسخه دقیق همه پکیج ها رو ذکر کنید، وگرنه pip به صورت پیشفرض آخرین نسخه موجود رو نصب می کنه و این در آینده باعث ناسازگاری script شما با پکیج میشه. چون که در طی زمان نسخه های جدید تری از این پکیج ها منتشر میشه و ممکنه در این نسخه های جدید api تغییر اساسی پیدا کنه و دیگه قابل استفاده در کنار script شما نباشه.
این یک نمونه از محتوای فایل requirements.txt است:
SomePackageName==2.0.4 AnotherPackage==4.2.2 ...
اگر (حوصله ندارید برسی کنید وابستگی های پروژه شما چه چیز هایی هستند && دارید از یک virtual envirnoment استفاده می کنید)
{ با استفاده از دستور pip freeze > requirements.txt می تونید به طور اتوماتیک این کار رو انجام بدید. عملگر < باعث هدایت خروجی stdout به یک فایل میشه }
هر script ای یه سری آرگومان داره که باید هنگام اجرا از کاربر دریافت کنه. این آرگومان ها در پایتون از طریق sys.argv در دسترس اند. بعضی ها خودشون این آرگومان ها رو پردازش می کنند.
بدی این روش اینه که اولا زمان گیره و دوما به اندازه کافی انعطاف پذیر نیست.مثلا اگه ترتیب آرگومان ها و سوئیچ ها رو عوض کنیم همه چیز خراب میشه.
البته میشه همه این شرایط رو هم در نظر گرفت، ولی چرا آخه اینقدر به خودمون فشار بیاریم وقتی ماژول argparse رو در کتابخانه استاندارد پایتون داریم؟ این ماژول هم همه آرگومان ها و سوئیچ ها رو پردازش می کنه و هم اگه مشکلی پیش بیاد می تونه یه help message خوشگل برای کاربران به نمایش بزاره و کاربر رو در استفاده از script راهنمایی کنه.
import argparse parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') args = parser.parse_args() print(args.accumulate(args.integers))
این هم یک مثال از استفاده argparse که از کتابخانه استاندارد خود پایتون گرفته شده.
وقتی تعداد آرگومان های خط فرمان زیاد میشه، استفاده از script سخت و طاقت فرسا میشه و زمان زیادی از کاربر میگیره. البته برای بار اول نمیشه کاریش کرد و بالاخره باید این اطلاعات وارد بشن. ولی معمولا در این میان یه سری اطلاعات هست که هیچ تغییری نمیکنه و کاربر در هربار اجرای اسکریپت به طور ثابت از اونها استفاده می کنه.
اگه کاربر هروقت که بخواد از script استفاده کنه قرار باشه همه این اطلاعات ثابت رو تایپ کنه اذیت میشه برای همین باید برای کاربر راهی ایجاد کنیم که یک سری تنظیمات ثابت رو تعریف کنه و در هر بار اجرا، script رو به اون فایل config ارجاع بده.
هدف از ساختن script سرعت بخشیدن به کار های روزمره است نه طولانی تر کردن اونها.
نمی خوام وارد بعد پیاده سازی قضیه بشم، فقط می خوام یه دید کلی بهتون بدم.
به پایان این مطلب رسیدیم، امیدوارم براتون مفید بوده باشه.
لایک و کامنت یادتون نره.