اشکان محمدی
اشکان محمدی
خواندن ۵ دقیقه·۴ سال پیش

4 نکته اساسی برای ساخت script های حرفه ای تر با python

پایتون، همین...
پایتون، همین...

خیلی وقت ها دیدم که مبتدی ها بلافاصله بعد از یادگیری پایتون، شروع می کنن به ساخت script های کوچک (که البته شروع خوبی هم هست) چون پیچیدگی خاصی ندارند. من هم از این نوع script ها زیاد میسازم. هرچند هیچ کدوم مفت نمی ارزند. ولی به هر حال از ساخت script ها یه سری تجربیاتی کسب کردم که باعث شد script هام کم کم نسبت به قبل بهتر بشن. توی این پست 4 نکته اساسی که بر حسب تجربه کسب کردم رو باهاتون به اشتراک بزارم. امیدوارم مفید باشند.

شماره 1: اضافه کردن فایل setup

همیشه توی اکثر فایل های README گیتهاب مبتدی ها می بینم که نوشته اند: وارد فلان فولدر بشید، بعد وارد اون یکی فولدر بشید و ... آخرش هم فایل رو اجرا کنید.

واقعا چرا فکر می کنید کاربر خودش رو این همه به دردسر میندازه تا فایل script شما رو اجرا کنه؟؟اصلا هدف از ساختن script سرعت بخشیدن به کار های روزمره است نه طولانی تر کردن اونها. پس باید script تون رو طوری بسازید که قابلیت نصب داشته باشه. اینطوری کاربر می تونه ظرف چند ثانیه، از هرکجای سیستم script رو اجرا کنه. اما سوال اساسی اینجاست که چطور این کار رو بکنیم!؟

ایجاد فایل setup.py

فقط کافیه یک فایل setup در کنار فایل script تون داشته باشید، محتوای اون هم زیاد پیچیده نیست. این نمونه ای از فایل setup هست: (با درنظر گرفتن حداقل تنظیمات و اطلاعات)

from distutils.core import setup setup ( name='name of project', version='1.0', scripts=[&quotyour_script.py&quot] )

حالا اینها رو در فایل setup.py وارد کنید، و دستور python setup.py install رو بزنید و تمام! اسکریپت نصب شد! حال می تونید از هرجای سیستم که باشید script رو اجرا کنید و دیگه لازم نیست به پوشه خود script مراجعه کنید.

برای اطلاعات بیشتر می تونید به documentation خود پایتون مراجعه کنید.

شماره 2: ذکر کردن وابستگی های پروژه در فایل requirements.txt

خوب بالاخره ممکنه 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 ...

ایجاد اتوماتیک requirements.txt

اگر (حوصله ندارید برسی کنید وابستگی های پروژه شما چه چیز هایی هستند && دارید از یک virtual envirnoment استفاده می کنید)

{ با استفاده از دستور pip freeze > requirements.txt می تونید به طور اتوماتیک این کار رو انجام بدید. عملگر < باعث هدایت خروجی stdout به یک فایل میشه }

شماره 3: استفاده از argparse برای پردازش آرگومان های خط فرمان

هر 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 که از کتابخانه استاندارد خود پایتون گرفته شده.

شماره 4: پشتیبانی از فایل های config

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

اگه کاربر هروقت که بخواد از script استفاده کنه قرار باشه همه این اطلاعات ثابت رو تایپ کنه اذیت میشه برای همین باید برای کاربر راهی ایجاد کنیم که یک سری تنظیمات ثابت رو تعریف کنه و در هر بار اجرا، script رو به اون فایل config ارجاع بده.

هدف از ساختن script سرعت بخشیدن به کار های روزمره است نه طولانی تر کردن اونها.

چه فرمتی برای فایل config استفاده کنیم؟

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

  • اگه قرار تنظیمات به صورت dynamic ایجاد بشن، از فایل های config پایتونی استفاده کنید. مثلا config.py که شامل کد های صحیح پایتون میشه. اینطور فایل ها انعطاف پذیری بسیار بالایی دارند.
  • اگه قراره تنظیمات به صورت static ذخیره بشن بهتره از فایل های json (یا xml یا ... هرچی دلتون خواست) استفاده کنید. از import کردن فایل پایتون راحت تره.



به پایان این مطلب رسیدیم، امیدوارم براتون مفید بوده باشه.

لایک و کامنت یادتون نره.
پایتونscriptpythonبرنامه نویسیcli
یه برنامه نویس ساده که از تجربیات و آموخته هاش می نویسه
شاید از این پست‌ها خوشتان بیاید