سب پروسیس رن میتھڈ کا استعمال کرتے ہوئے ازگر میں شیل کمانڈز کیسے چلائیں۔

How Execute Shell Commands Python Using Subprocess Run Method



سب پروسیس ایک بلٹ ان ازگر ماڈیول ہے جسے نئے عمل بنانے اور ان پٹ اور آؤٹ پٹ ڈیٹا اسٹریمز کے ساتھ تعامل کے لیے استعمال کیا جا سکتا ہے۔ آسان الفاظ میں ، آپ اسے شیل کمانڈز چلانے اور قابل عمل بائنریز چلانے کے لیے استعمال کر سکتے ہیں جو عام طور پر لینکس فائل سسٹم میں مختلف بن فولڈرز میں بکھرے ہوئے ہیں۔ آپ ایک قابل عمل بائنری کو مکمل راستہ بھی فراہم کرسکتے ہیں اور بائنری سے وابستہ کسی بھی کمانڈ لائن سوئچ کو استعمال کرسکتے ہیں۔ یہ مضمون وضاحت کرے گا کہ کس طرح سب پروسیس ماڈیول اور اس کے چلانے کا طریقہ ازگر ایپس میں استعمال کیا جائے۔ مضمون میں موجود تمام کوڈ کے نمونوں کو اوبنٹو 20.04 پر ازگر 3.8.2 کے ساتھ آزمایا گیا ہے۔

Subprocess.run طریقہ۔

Subprocess.run طریقہ کار دلائل کی ایک فہرست لیتا ہے۔ جب طریقہ کہا جاتا ہے ، یہ کمانڈ پر عملدرآمد کرتا ہے اور عمل ختم ہونے کا انتظار کرتا ہے ، آخر میں ایک مکمل پروسیس آبجیکٹ واپس کرتا ہے۔ CompletedProcess آبجیکٹ stdout ، stderr ، طریقہ کار کو کال کرتے ہوئے استعمال کیے گئے اصل دلائل اور واپسی کا کوڈ لوٹاتا ہے۔ اسٹڈ آؤٹ سے مراد کمانڈ کے ذریعہ تیار کردہ ڈیٹا سٹریم ہے ، جبکہ stderr پروگرام کے نفاذ کے دوران اٹھائی گئی کسی بھی غلطی سے مراد ہے۔ کوئی بھی غیر صفر ریٹرن کوڈ (ایگزٹ کوڈ) کا مطلب subprocess.run طریقہ میں عمل میں آنے والی کمانڈ میں خرابی ہوگی۔







مثال 1: Subprocess.run طریقہ استعمال کرتے ہوئے ٹیکسٹ فائل کے آؤٹ پٹ مواد۔

نیچے دی گئی کمانڈ data.txt فائل کے مندرجات کو آؤٹ پٹ کرے گی ، یہ فرض کرتے ہوئے کہ اس میں ایک نام = جان سٹرنگ ہے۔



درآمد ذیلی عمل
ذیلی عمل.رن(['کیٹ'، 'data.txt'])

مندرجہ بالا کوڈ چلانے سے درج ذیل آؤٹ پٹ واپس آئے گا:



نام=جان
مکمل عمل(دلائل=['کیٹ'، 'data.txt']،ریٹرن کوڈ=)

فہرست دلیل کا پہلا عنصر عملدرآمد ہونے والی کمانڈ کا نام ہے۔ فہرست میں کوئی بھی عنصر جو پہلے عنصر کی پیروی کرتا ہے اسے کمانڈ لائن آپشن یا سوئچ سمجھا جاتا ہے۔ آپ اختیارات کی وضاحت کے لیے سنگل ڈیش اور ڈبل ڈیش بھی استعمال کر سکتے ہیں۔ مثال کے طور پر ، کسی ڈائرکٹری میں فائلوں اور فولڈروں کی فہرست بنانے کے لیے ، کوڈ subprocess.run ([ls ، -l] ہوگا۔ ان میں سے بیشتر معاملات میں ، آپ شیل کمانڈ میں کسی بھی جگہ سے الگ ہونے والی دلیل کو انفرادی عنصر سمجھ سکتے ہیں۔ subprocess.run طریقہ کو فراہم کردہ فہرست۔





مثال 2: Subprocess.run طریقہ کے آؤٹ پٹ کو دبائیں۔

subprocess.run طریقہ کار کی پیداوار کو دبانے کے لیے ، آپ کو اضافی دلائل کے طور پر stdout = subprocess.DEVNULL اور stderr = subprocess.DEVNULL فراہم کرنا پڑے گا۔

درآمد ذیلی عمل

ذیلی عمل.رن(['کیٹ'، 'data.txt']،stdout=ذیلی عمل.ڈیونول،
سٹڈرر=ذیلی عمل.ڈیونول)

مندرجہ بالا کوڈ کو چلانے سے درج ذیل آؤٹ پٹ پیدا ہوگی:



مکمل عمل (args = ['cat'، 'data.txt']، returncode = 0)

مثال 3: Subprocess.run میتھڈ کا کیپچر آؤٹ پٹ۔

subprocess.run طریقہ کار کی پیداوار حاصل کرنے کے لیے ، ایک اضافی دلیل استعمال کریں جس کا نام Capt_output = True ہے۔

درآمد ذیلی عمل
پیداوار= ذیلی عمل.رن(['کیٹ'، 'data.txt']،کیپچر آؤٹ پٹ۔=سچ ہے۔)
پرنٹ کریں (پیداوار)

مندرجہ بالا کوڈ کو چلانے سے درج ذیل آؤٹ پٹ پیدا ہوگا:

مکمل عمل(دلائل=['کیٹ'، 'data.txt']،ریٹرن کوڈ=،
stdout=بنام = جان۔n'،stderr=ب'')

آپ انفرادی طور پر output.stdout اور output.stderr طریقوں کو استعمال کرکے stdout اور stderr اقدار تک رسائی حاصل کر سکتے ہیں۔ آؤٹ پٹ ایک بائٹ تسلسل کے طور پر تیار کیا جاتا ہے۔ سٹرنگ کو بطور آؤٹ پٹ حاصل کرنے کے لیے ، output.stdout.decode (utf-8) طریقہ استعمال کریں۔ آپ سٹرنگ فارمیٹ میں آؤٹ پٹ حاصل کرنے کے لیے subprocess.run کال کو اضافی دلیل کے طور پر text = True بھی فراہم کر سکتے ہیں۔ ایگزٹ سٹیٹس کوڈ حاصل کرنے کے لیے ، آپ output.returncode طریقہ استعمال کر سکتے ہیں۔

مثال 4: Subprocess.run میتھڈ کے ذریعے چلائے گئے کمانڈ کی ناکامی پر استثناء بلند کریں۔

جب کمانڈ غیر صفر کی حیثیت سے نکلتا ہے تو استثناء بڑھانے کے لیے ، چیک = ٹری دلیل استعمال کریں۔

درآمد ذیلی عمل
ذیلی عمل.رن(['کیٹ'، 'data.tx']،کیپچر آؤٹ پٹ۔=سچ ہے۔،متن=سچ ہے۔،چیک کریں=سچ ہے۔)

مندرجہ بالا کوڈ کو چلانے سے درج ذیل آؤٹ پٹ پیدا ہوگا:

CalledProcessError (retcode ، process.args ،
subprocess.CalledProcessError: Command '[' cat '،' data.tx ']'
غیر صفر ایگزٹ سٹیٹس لوٹا دیا 1۔

مثال 5: Subprocess.run میتھڈ کے ذریعے ایک سٹرنگ کو کمانڈ پر عمل کریں۔

آپ ان پٹ = 'سٹرنگ' دلیل استعمال کرکے subprocess.run طریقہ سے عملدرآمد کرنے کے لیے ایک سٹرنگ پاس کرسکتے ہیں۔

درآمد ذیلی عمل
پیداوار= ذیلی عمل.رن(['کیٹ']، ان پٹ='data.txt'،کیپچر آؤٹ پٹ۔=سچ ہے۔،
متن=سچ ہے۔،چیک کریں=سچ ہے۔)
پرنٹ کریں (پیداوار)

مندرجہ بالا کوڈ کو چلانے سے درج ذیل آؤٹ پٹ پیدا ہوگی:

مکمل شدہ عمل (args = ['cat']، returncode = 0، stdout = 'data.txt'، stderr = '')

جیسا کہ آپ دیکھ سکتے ہیں ، اوپر کا کوڈ data.txt کو بطور سٹرنگ گزرتا ہے نہ کہ فائل آبجیکٹ کے طور پر۔ data.txt کو بطور فائل پاس کرنے کے لیے ، stdin دلیل استعمال کریں۔

کے ساتھ کھلا('data.txt') جیسا کہf:
پیداوار= ذیلی عمل.رن(['کیٹ']،stdin=f،کیپچر آؤٹ پٹ۔=سچ ہے۔،
متن=سچ ہے۔،چیک کریں=سچ ہے۔)
پرنٹ کریں (پیداوار)

مندرجہ بالا کوڈ کو چلانے سے درج ذیل آؤٹ پٹ پیدا ہوگا:

مکمل عمل (args = ['cat']، returncode = 0، stdout = 'name = John n'، stderr = '')

مثال 6: Subprocess.run میتھڈ کا استعمال کرتے ہوئے کمانڈ کو براہ راست شیل میں چلائیں۔

مرکزی کمانڈ میں سٹرنگ سپلٹ اور اس کے بعد آنے والے آپشنز کو استعمال کرنے کے بجائے کمانڈ کو براہ راست شیل میں چلانا ممکن ہے۔ ایسا کرنے کے لیے ، آپ کو اضافی دلیل کے طور پر shell = True پاس کرنا ہوگا۔ تاہم ، ازگر ڈویلپرز کی طرف سے حوصلہ شکنی کی گئی ہے کیونکہ shell = True استعمال کرنا سیکیورٹی کے مسائل کا باعث بن سکتا ہے۔ آپ سیکورٹی کے مضمرات کے بارے میں مزید پڑھ سکتے ہیں۔ یہاں .

درآمد ذیلی عمل
ذیلی عمل.رن('cat' data.txt ''،خول=سچ ہے۔)

مندرجہ بالا کوڈ کو چلانے سے درج ذیل آؤٹ پٹ پیدا ہوگا:

نام = جان

نتیجہ

ازگر میں subprocess.run طریقہ کافی طاقتور ہے ، کیونکہ یہ آپ کو ازگر میں ہی شیل کمانڈ چلانے کی اجازت دیتا ہے۔ یہ علیحدہ فائلوں میں اضافی شیل اسکرپٹ کوڈ کی ضرورت کے بغیر خود کو ازگر تک محدود کرنے میں مدد کرتا ہے۔ تاہم ، ازگر کی فہرست میں شیل کمانڈز کو صحیح طریقے سے ٹوکنائز کرنا کافی مشکل ہوسکتا ہے۔ آپ shlex.split () طریقہ استعمال کر سکتے ہیں تاکہ سادہ شیل کمانڈز کو ٹوکنائز کیا جا سکے ، لیکن طویل ، پیچیدہ احکامات میں - خاص طور پر پائپ علامتوں والے - shlex کمانڈ کو صحیح طریقے سے تقسیم کرنے میں ناکام رہتا ہے۔ ایسے معاملات میں ، ڈیبگنگ ایک مشکل مسئلہ ہوسکتا ہے۔ آپ اس سے بچنے کے لیے shell = True دلیل استعمال کر سکتے ہیں ، لیکن اس کارروائی سے کچھ سیکورٹی خدشات وابستہ ہیں۔