Python اور Bash کو دوست بنانا: smart-env اور python-shell لائبریریاں

سب کو اچھا دن۔

آج، Python نہ صرف خود سافٹ ویئر پروڈکٹس بنانے بلکہ اپنا انفراسٹرکچر فراہم کرنے کے میدان میں سب سے زیادہ استعمال ہونے والی زبانوں میں سے ایک ہے۔ نتیجے کے طور پر، بہت سے ڈیوپس کو، چاہے ان کی مرضی سے یا اس کے خلاف، بعد میں اچھے پرانے باش اسکرپٹ کے ضمیمہ کے طور پر استعمال کرنے کے لیے ایک نئی زبان سیکھنی پڑی۔ تاہم، Bash اور Python کوڈ لکھنے کے لیے مختلف طریقوں کا دعویٰ کرتے ہیں اور ان میں کچھ خصوصیات ہیں، مطلب یہ ہے کہ Bash اسکرپٹ کو "سانپ کی زبان" میں پورٹ کرنا بعض اوقات ایک قابل اور معمولی کام سے دور ہوتا ہے۔

ڈیوپس کے لیے زندگی کو آسان بنانے کے لیے، Python میں بہت سی مفید لائبریریاں اور یوٹیلیٹیز بنائی گئی ہیں اور بنتی رہتی ہیں۔ یہ مضمون اس پوسٹ کے مصنف کے ذریعہ تخلیق کردہ دو نئی لائبریریوں کی وضاحت کرتا ہے۔ smart-env и ازگر کا خول - اور مزید دلچسپ کاموں کے لیے گنجائش چھوڑ کر، Python کے ساتھ کام کرنے کی پیچیدگیوں پر بہت زیادہ توجہ دینے کی ضرورت سے ڈیوپس کو دور کرنے کے لیے ڈیزائن کیا گیا ہے۔ لائبریریوں کی سرگرمی کا دائرہ کار ماحولیاتی تغیرات اور بیرونی افادیت کا آغاز ہے۔

کوئی بھی دلچسپی رکھتا ہے، براہ کرم بلی کو دیکھیں۔

نئی "سائیکلیں"؟

ایسا لگتا ہے، کیوں کافی عام آپریشنز کے لیے نئے پیکجز بنائیں؟ آپ کو os.environ اور subprocess کو استعمال کرنے سے کیا روکتا ہے۔<طریقہ یا آپ کی پسند کی کلاس> براہ راست؟

میں ہر ایک لائبریری کے حق میں علیحدہ علیحدہ ثبوت فراہم کروں گا۔

smart-env لائبریری

اپنے دماغ کی تخلیق لکھنے سے پہلے، آن لائن جانا اور تیار حل تلاش کرنا مفید ہے۔ بلاشبہ، آپ کو مطلوبہ چیز نہ ملنے کا خطرہ ہے، لیکن یہ ایک "انشورنس ایونٹ" ہے۔ ایک اصول کے طور پر، یہ نقطہ نظر کام کرتا ہے اور بہت وقت اور کوشش بچاتا ہے.

نتائج کے مطابق تلاش کریں مندرجہ ذیل انکشاف ہوا:

  • ایسے پیکجز ہیں جو دراصل کالز کو os.environ پر لپیٹ دیتے ہیں، لیکن اس کے ساتھ ہی پریشان کن ایکشنز کی ضرورت ہوتی ہے (کلاس کی مثال بنانا، کالز میں خصوصی پیرامیٹرز وغیرہ)؛
  • اچھے پیکجز ہیں، تاہم، ایک مخصوص ماحولیاتی نظام (بنیادی طور پر ویب فریم ورک جیسے جیانگو) سے سختی سے جڑے ہوئے ہیں اور اس لیے فائل کے بغیر بالکل بھی عالمگیر نہیں ہیں۔
  • کچھ نیا کرنے کی کوششیں نایاب ہیں۔ مثال کے طور پر، ٹائپنگ شامل کریں اور واضح طور پر کال کرنے کے طریقوں جیسے متغیر اقدار کو پارس کریں۔
    get_<typename>(var_name)

    یا یہاں ایک اور حل، جو، تاہم، اب بدنام شدہ ازگر 2 کی حمایت نہیں کرتا ہے (جس کے باوجود سرکاری RIP, ابھی بھی تحریری کوڈ اور پورے ماحولیاتی نظام کے پہاڑ موجود ہیں؛

  • اسکول کے طلباء کے دستکاری ہیں جو کہ کسی نامعلوم وجہ سے، اپ اسٹریم PyPI میں ختم ہوئیں اور صرف نئے پیکجوں کے نام کے ساتھ مسائل پیدا کرتی ہیں (خاص طور پر، نام "smart-env" ایک ضروری اقدام ہے)۔

اور یہ فہرست طویل عرصے تک چل سکتی ہے۔ تاہم، مندرجہ بالا نکات مجھے کچھ آسان اور آفاقی بنانے کے خیال کے بارے میں پرجوش کرنے کے لیے کافی تھے۔

وہ تقاضے جو smart-env لکھنے سے پہلے طے کیے گئے تھے:

  • استعمال کی سب سے آسان اسکیم
  • آسانی سے قابل ترتیب ڈیٹا ٹائپنگ سپورٹ
  • Python 2.7 ہم آہنگ
  • ٹیسٹ کے ذریعہ اچھی کوڈ کوریج

بالآخر اس سب کا احساس ہوا۔ یہاں استعمال کی ایک مثال ہے:

from smart_env import ENV

print(ENV.HOME)  # Equals print(os.environ['HOME'])

# assuming you set env variable MYVAR to "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Equals boolean True

ENV.NEW_VAR = 100  # Sets a new environment variable

جیسا کہ آپ مثال سے دیکھ سکتے ہیں، ایک نئی کلاس کے ساتھ کام کرنے کے لیے، آپ کو صرف اسے درآمد کرنے کی ضرورت ہے (آپ کو ایک مثال بنانے کی ضرورت نہیں ہے - اضافی کارروائی کو کم کر کے)۔ کسی بھی ماحولیاتی متغیر تک رسائی اسے ENV کلاس کے متغیر کے طور پر حوالہ دے کر حاصل کی جاتی ہے، جو درحقیقت اس کلاس کو مقامی نظام کے ماحول کے لیے ایک بدیہی ریپر بناتا ہے، جبکہ بیک وقت اسے تقریباً کسی بھی سسٹم کے لیے ایک ممکنہ کنفیگریشن آبجیکٹ میں تبدیل کرتا ہے۔ اسی طرح کا نقطہ نظر، مثال کے طور پر، Django میں حاصل کیا جاتا ہے، صرف وہاں کنفیگریشن آبجیکٹ سیٹنگز ماڈیول/پیکیج ہی ہوتا ہے)۔

خودکار ٹائپنگ سپورٹ موڈ کو فعال/غیر فعال کرنا دو طریقوں سے حاصل کیا جاتا ہے - enable_automatic_type_cast() اور disable_automatic_type_cast()۔ یہ آسان ہوسکتا ہے اگر ماحولیاتی متغیر میں سیریلائزڈ JSON نما آبجیکٹ یا یہاں تک کہ صرف ایک بولین کنسٹنٹ ہو (واضح طور پر ڈیبگ متغیر کو جینگو میں "درست" تاروں کے ساتھ موازنہ کرکے ڈیبگ متغیر کو ترتیب دینا سب سے عام صورتوں میں سے ایک ہے)۔ لیکن اب واضح طور پر تاروں کو تبدیل کرنے کی ضرورت نہیں ہے - زیادہ تر ضروری کارروائیاں لائبریری کی گہرائیوں میں پہلے سے ہی سرایت کر چکی ہیں اور صرف عمل کرنے کے لیے سگنل کا انتظار کر رہی ہیں۔ 🙂 عام طور پر، ٹائپنگ شفاف طریقے سے کام کرتی ہے اور تقریباً تمام دستیاب بلٹ ان ڈیٹا کی اقسام کو سپورٹ کرتی ہے (منجمد، پیچیدہ اور بائٹس کا تجربہ نہیں کیا گیا)۔

ازگر 2 کو سپورٹ کرنے کی ضرورت کو عملی طور پر بغیر کسی قربانی کے لاگو کیا گیا تھا (ٹائپنگ کو ترک کرنا اور ازگر 3 کے تازہ ترین ورژن کی کچھ "شوگر کینڈیز")، خاص طور پر ہر جگہ موجود چھ کی بدولت (میٹاکلاسز کے استعمال کے مسائل کو حل کرنے کے لیے) )۔

لیکن کچھ پابندیاں ہیں:

  • Python 3 سپورٹ کا مطلب ورژن 3.5 اور اس سے زیادہ ہے (آپ کے پروجیکٹ میں ان کی موجودگی یا تو کاہلی یا بہتری کی ضرورت کی کمی کا نتیجہ ہے، کیوں کہ آپ کے 3.4 پر کیوں ہیں اس کی معروضی وجہ سامنے لانا مشکل ہے)؛
  • Python 2.7 میں، لائبریری سیٹ لٹریلز کی ڈی سیریلائزیشن کی حمایت نہیں کرتی ہے۔ تفصیل یہاں. لیکن اگر کوئی اس پر عمل درآمد کرنا چاہتا ہے تو آپ کا استقبال ہے :);

پارسنگ کی غلطیوں کی صورت میں لائبریری میں ایک استثنائی طریقہ کار بھی ہے۔ اگر سٹرنگ کو دستیاب تجزیہ کاروں میں سے کسی کے ذریعے نہیں پہچانا جا سکتا ہے، تو قدر ایک سٹرنگ ہی رہتی ہے (بلکہ، سہولت کی وجوہات کی بناء پر اور باش میں متغیرات کے کام کرنے کی معمول کی منطق کے ساتھ پسماندہ مطابقت کی وجہ سے)۔

python-shell لائبریری

اب میں آپ کو دوسری لائبریری کے بارے میں بتاؤں گا (میں موجودہ اینالاگس کی کوتاہیوں کی تفصیل کو چھوڑ دوں گا - یہ اسی طرح ہے جیسا کہ سمارٹ این وی کے لیے بیان کیا گیا ہے۔ analogues - یہاں и یہاں).

عام طور پر، نفاذ کا خیال اور اس کے لیے تقاضے سمارٹ این وی کے لیے بیان کیے گئے تصورات سے ملتے جلتے ہیں، جیسا کہ مثال سے دیکھا جا سکتا ہے:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Equals "ls -l $HOME"

command = Shell.whoami()  # Equals "whoami"
print(command.output)  # prints your current user name

print(command.command)  # prints "whoami"
print(command.return_code)  # prints "0"
print(command.arguments)  # prints ""

Shell.mkdir('-p', '/tmp/new_folder')  # makes a new folder

خیال یہ ہے:

  1. ایک واحد کلاس جو ازگر کی دنیا میں باش کی نمائندگی کرتی ہے۔
  2. ہر باش کمانڈ کو شیل کلاس کے فنکشن کے طور پر کہا جاتا ہے۔
  3. ہر فنکشن کال کے پیرامیٹرز پھر متعلقہ Bash کمانڈ کال میں بھیجے جاتے ہیں۔
  4. ہر کمانڈ کو اس وقت "یہاں اور اب" پر عمل کیا جاتا ہے جس وقت اسے کہا جاتا ہے، یعنی ہم وقت ساز نقطہ نظر کام کرتا ہے؛
  5. stdout میں کمانڈ کے آؤٹ پٹ کے ساتھ ساتھ اس کے ریٹرن کوڈ تک رسائی ممکن ہے۔
  6. اگر کمانڈ سسٹم میں نہیں ہے تو، ایک استثناء پھینک دیا جاتا ہے.

جیسا کہ smart-env کے ساتھ، Python 2 کے لیے سپورٹ موجود ہے (اگرچہ تھوڑا زیادہ قربانی کے خون کی ضرورت تھی) اور Python 3.0-3.4 کے لیے کوئی سپورٹ نہیں ہے۔

لائبریری کی ترقی کے منصوبے

آپ ابھی لائبریریوں کو استعمال کر سکتے ہیں: دونوں سرکاری PyPI پر پوسٹ کیے گئے ہیں۔ ذرائع Github پر دستیاب ہیں (نیچے ملاحظہ کریں)۔

دونوں لائبریریوں کو دلچسپی رکھنے والوں سے جمع کیے گئے فیڈ بیک کو مدنظر رکھتے ہوئے تیار کیا جائے گا۔ اور، اگر smart-env میں مختلف قسم کی نئی خصوصیات کے ساتھ آنا مشکل ہوسکتا ہے، تو python-shell میں یقینی طور پر کچھ اور شامل کرنے کے لیے ہے:

  • غیر مسدود کالوں کے لیے سپورٹ؛
  • ٹیم کے ساتھ انٹرایکٹو مواصلت کا امکان (stdin کے ساتھ کام کرنا)؛
  • نئی خصوصیات شامل کرنا (مثال کے طور پر، stderr سے آؤٹ پٹ حاصل کرنے کے لیے پراپرٹی)؛
  • دستیاب کمانڈز کی ڈائرکٹری کا نفاذ (dir() فنکشن کے ساتھ استعمال کے لیے؛
  • وغیرہ

حوالہ جات

  1. smart-env لائبریری: Github کے и پییآئآئ
  2. python-shell لائبریری: Github کے и پییآئآئ
  3. ٹیلیگرام چینل لائبریری اپ ڈیٹس

UPD 23.02.2020/XNUMX/XNUMX:
* ذخیرے منتقل کردیئے گئے ہیں، متعلقہ لنکس کو اپ ڈیٹ کردیا گیا ہے۔
* python-shell==1.0.1 ورژن 29.02.2020/XNUMX/XNUMX کو ریلیز کے لیے تیار کیا جا رہا ہے۔ تبدیلیوں میں کمانڈ آٹوکمپلیٹ اور dir(Shell) کمانڈ کے لیے سپورٹ، ایک غلط Python شناخت کنندہ کے ساتھ کمانڈز چلانا، اور بگ فکسز شامل ہیں۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں