أكتب برامج CLI بسعادة مع مكتبة Click في لغة البايثون – تطبيق عملي
شرح مكتبات بايثون – مكتبة كليك :
أهلا بكم في بايثونات في هذا المقال الجديد والمميز. من أجمل و أمتع مميزات لغة البايثون هي كتابة برامج سطر الأوامر CLI – Command Line Interface كما هو الحال المعتاد بشكل قياسي في برامج لينكس و يونكس، حيث نكتب إسم البرنامج داخل نافذة الأوامر terminal في ماك و لينكس أو cmd في ويندوز، ملحوقًا بمعاملات أو أي بيانات تريد تغذيتها للبرنامج الرئيسي ليتم معالجتها أو استخدامها للحصول على نتيجة ما ترغب بها مباشرة.
تأتي لغة البايثون مع مكتبات ممتازة لهذا الغرض مثل aptparse و argparse. تعد مكتبة argparse هي الأكثر تطورًا، حيث تأتي بخيارات و دوال عديدة تُضيف مميزات تفاعلية جميلة لبرامج CLI. على الرغم من مميزاتها، إلا أنها تتطلب كتابة شيفرات طويلة نسبيًا و محاولة فهم طريقة تركيبها بشكل خاص لنتمكن من استيعابها بكل سلاسة.
في هذا المقال نستعرض معكم كيفية استخدام مكتبة أوامر جديدة وسهلة في لغة البايثون و سلسة وقوية بنفس الوقت تُسمى click.
يمكنك أن تتصفح الموقع الرسمي للمكتبة هنا:
https://click.palletsprojects.com/en/7.x/
يمكن تثبيت مكتبة click من خلال مثبت الحزم pip في لغة البايثون بالشكل التالي:
[pastacode lang=”bash” manual=”pip3%20install%20click” message=”” highlight=”” provider=”manual”/]
مفاهيم هامة في مكتبة click
من المهم في البداية أن نتفق على مفاهيم ومفردات معينة لنستخدمها في هذا الدرس ليتم استيعابه بشكل جيد و لنتمكن من فهم الشيفرات البرمجية المكتوبة وبناء CLI و التفاعل مع الشيفرات البرمجية في لغة البايثون بالشكل الذي نريد.
المعاملات Arguments: هي قيم لابد من كتابتها بشكل إجباري وبالترتيب بسطر الأوامر بعد كتابة إسم البرنامج، وهي قيم إجبارية يحتاجها برنامجك ليعمل بشكل صحيح (كما تصممه و كما سنرى و نتعلم ذلك بشكل عملي).
الإختيارات Options: هي قيم اختيارية، أي أن المستخدم للبرنامج الذي قمت بتصميمه مخير أن يدخل تلك القيم أو يتركها. تلك القيم ليس مهما أن تدخل بالترتيب، بل يتم إدخالها بعد كتابة رمز يبين أن تلك القيمة يجب أن تخزن بداخله، أو حتى لتقوم تلك الرموز الاختيارية بتفعيل دوال معينة إضافية كإجراءات إضافية للنتائج التي نريد الحصول عليها.
الجزء العملي في مكتبة click
لنقم الآن بكتابة برنامج بسيط باستخدام لغة البايثون يقوم بطباعة الإسم الأول واسم العائلة للمستخدم باستخدام مكتبة click. سنجعل من الإسم الأول معامل إجباري واسم العائلة اختياري، وستكون طريقة استدعاء البرنامج كالتالي:
[pastacode lang=”bash” manual=”python3%20click_play.py%20nasser%20–family%20alostath” message=”” highlight=”” provider=”manual”/]
البرنامج
[pastacode lang=”python” manual=”%23!%2Fusr%2Fbin%2Fenv%20python3%0A%0A%23%20importing%20click%0Aimport%20click%20%2C%20os%0A%0A%23%20click%20uses%20decorators%20(%20starting%20with%20%40%20)%20to%20add%20commands%2Carguments%2Coptions%20…etc%0A%40click.command()%20%23%20main%20command%20within%20which%20all%20arguments%20and%20options%20go%0A%40click.option(‘–family’%2C’-f’)%20%23%20an%20option%20%2Cwith%20long%20and%20short%20form%0A%40click.argument(‘name’)%20%23%20an%20argument%0A%0A%23%20main%20function%20%2C%20where%20the%20variables%20created%20above%20as%20an%20option%20and%20argument%20are%20passed%0Adef%20main(family%2Cname)%3A%0A%20%20%20%20os.system(‘clear’)%20%23%20to%20clear%20the%20screen%20on%20launch%0A%0A%20%20%20%20%23%20if%20the%20family%20name%20is%20None%20just%20make%20it%20equal%20to%20nothing%0A%20%20%20%20if%20family%20%3D%3D%20None%3A%0A%20%20%20%20%20%20%20%20family%20%3D%22%22%0A%20%20%20%20%23%20print%20out%20the%20name%20%2F%20full%20name%0A%20%20%20%20print(f’hello%20%7Bname%7D%20%7Bfamily%7D…’)%0A%0Aif%20__name__%20%3D%3D%20’__main__’%3A%0A%20%20%20%20main()” message=”” highlight=”” provider=”manual”/]
والآن لنشرح البرنامج أعلاه:
[pastacode lang=”python” manual=”import%20click%20%2C%20os” message=”” highlight=”” provider=”manual”/]
استوردنا مكتبة click ومكتبة os لنستخدم الدالة system في تمرير وتنفيذ أوامر لنافذة الأوامر، بحيث سنستخدمها لتنظيف نافذة الأوامر في كل مرة نُنفذ فيها البرنامج كما سنرى لاحقا.
[pastacode lang=”python” manual=”%40click.command()%20%23%20main%20command%20within%20which%20all%20arguments%20and%20options%20go%0A%40click.option(‘–family’%2C’-f’)%20%23%20an%20option%20%2Cwith%20long%20and%20short%20form%0A%40click.argument(‘name’)%20%23%20an%20argument%0A” message=”” highlight=”” provider=”manual”/]
في الأسطر أعلاه نلاحظ أن click تعتمد بشكل أساسي على المزخرفات decorators والتي تبدأ بالرمز @. لن نتطرق لشرح طريقة عمل المزخرفات هنا ولكن يكفينا أن نأخذ فكرة عامة عنها. المزخرفات هي دوال تأخذ دوال كمعاملات لها وتقوم بإرجاع دوال مُحسنة او مُعدلة من المدخلة كقيم مرجعة منها. أما هنا في هذا الدرس فيكفينا أن نفهم أنها طريقة لإنشاء المعاملات و الإختيارات في click.
[pastacode lang=”python” manual=”%40click.command()” message=”” highlight=”” provider=”manual”/]
يُنشئ أمر رئيسي تندرج تحته جميع المعاملات والإختيارات التي سننشئها لاحقا.
[pastacode lang=”python” manual=”%40click.option(‘–family’%2C’-f’)” message=”” highlight=”” provider=”manual”/]
يُنشئ اختيار option، بحيث أن family– هي الصيغة المطولة منه و f- هي الصيغة المصغرة. المستخدم مُخير أن يستخدم أي من الصيغتين أثناء تشغيل البرنامج من سطر الأوامر. ما يليه هي القيمة التي نريد أن يأخذها الإختيار.
[pastacode lang=”python” manual=”%40click.argument(‘name’)” message=”” highlight=”” provider=”manual”/]
يُنشئ معامل إجباري Argument أي لابد للمستخدم أن يدخل قيمة له أثناء التشغيل بسطر الأوامر ليعمل البرنامج. ذلك يعني أن المعاملات الإجبارية عندما نعينها في برنامجنا هي شرط أساسي للبرنامج ليشتغل.
نلاحظ أننا مررنا المتغيرات name و family للدالة main. تلك المتغيرات هي نفسها التي قمنا بإنشائها كمعامل وإختيار من الأسطر السابقة ليتم الاستفادة منها لاحقا.
[pastacode lang=”python” manual=”os.system(‘clear’)%20%23%20to%20clear%20the%20screen%20on%20launch” message=”” highlight=”” provider=”manual”/]
فهو لتنظيف نافذة الأوامر بحيث أن كلمة clear هي أمر من أوامر نافذة الأوامر في لينكس و ماك و تقوم os.system نفسها بتنفيذها في النافذة. أما في ويندوز فيمكنك إستبدال clear بـ cls ليتم نفس العمل.
وأخيرا العبارة الشرطية هي لتختبر إذا ما كان اسم العائلة family يساوي القيمة None أي لا شيء لتجعله يساوي محرف طولة صفر “” لأنه في حال لم يتم ذلك سيتم طباعة كلمة None كجزء من المخرجات في دالة الطباعة التي تليها.
[pastacode lang=”python” manual=”%20%20%23%20if%20the%20family%20name%20is%20None%20just%20make%20it%20equal%20to%20nothing%0A%20%20%20%20if%20family%20%3D%3D%20None%3A%0A%20%20%20%20%20%20%20%20family%20%3D%22%22%0A%20%20%20%20%23%20print%20out%20the%20name%20%2F%20full%20name%0A%20%20%20%20print(f’hello%20%7Bname%7D%20%7Bfamily%7D…’)%0A” message=”” highlight=”” provider=”manual”/]
و الآن جرب البرنامج أولا بكتابة الأمر بالأشكال التالية و لاحظ مخرجاتك:
[pastacode lang=”bash” manual=”python3%20click_play.py%20Nasser%20-f%20alostath%0Apython3%20click_play.py%20Nasser%20–family%20alostath%0Apython3%20click_play.py%20Nasser%0A” message=”” highlight=”” provider=”manual”/]
وأيضا قم بتجربة التالي ولاحظ التنيجة:
[pastacode lang=”bash” manual=”python3%20click_play.py%20–help” message=”” highlight=”” provider=”manual”/]
نجد أن click قامت و بشكل تلقائي بعمل قائمة المساعدة والتي تشرح البرنامج الذي أعددناه. لاحظ أن المعامل name كُتب بأحرف كبيرة بالأعلى و كأنها جزء من أمر تشغيل البرنامج نفسه، في حين أننا نرى شرح الإختيارات في فقرة Options و فيها إختياراتنا التي أنشأناها، بالإضافة لاختيار help– و التي أعطتنا إياه click كجزء من البرنامج.
مثال آخر
لنقم بكتابة برنامج CLI بسيط بحيث يستقبل الإسم الأول والثاني والعائلة كمعاملات إجبارية ويطبعها على الشاشة بشكل مرتب مع إضافة إختيار طباعة الأسماء بألوان يمكن إختيارها من قبل المستخدم وكذلك إختيار طباعة العمر. من خلال هذا المثال سنتعلم أشياء أخرى إضافة لما سبق وكذلك سيكون الحال مع باقي الأمثلة في هذا الدرس إن شاء الله.
شكل الـ CLI سيكون مثل الشكل التالي:
[pastacode lang=”bash” manual=”python3%20showonscreen.py%20nasser%20bader%20alostath%20–color%20red%20–age%2038″ message=”” highlight=”” provider=”manual”/]
[pastacode lang=”python” manual=”import%20os%20%2C%20click%0A%0A%0A%40click.command()%0A%40click.argument(‘first’)%0A%40click.argument(‘second’)%0A%40click.argument(‘last’)%0A%40click.option(‘–color’%2C’-c’%2Chelp%3D’color’%2Cdefault%3D%22white%22)%0A%40click.option(‘–age’%2C’-a’%20%2Chelp%3D’age’)%0A%0Adef%20main(first%2Csecond%2Clast%2Ccolor%2Cage)%3A%0A%20%20%20%23%20echo%20can%20be%20styles%20with%20colors%20by%20using%20style%20method%20%2Cfg%20%20%20%20%20%20%20%20is%20foreground%20%2C%2C%20try%20bg%0A%20%20%20click.echo(%0A%20%20%20%20%20%20%20click.style(f%22%7Bfirst%7D%20%7Bsecond%7D%20%7Blast%7D%22%2Cfg%3Dcolor)%2C%0A%20%20%20%20%20%20%0A%20%20%20)%0A%0A%20%20%20click.echo(%0A%20%20%20%20%20%20%20click.style(f%22age%20%3D%20%7Bage%7D%22%2Cfg%3D’blue’%2Cbg%3D’white’)%0A%20%20%20)%0A%0Aif%20__name__%20%3D%3D%20’__main__’%3A%0A%20%20%20os.system(‘clear’)%0A%20%20%20main()” message=”” highlight=”” provider=”manual”/]
نلاحظ قوة الوظيفة echo بأنها تقبل الألوان من خلال تمرير دالة أخرى فيها وهي style والتي تمكننا من إضافة لون على النص، حيث أن المعامل fg هو لون الخط وbg هو لون الخلفية التي يكتب عليها الخط.
عند تشغيل البرنامج كما في الشكل السابق تكون النتيجة:
[pastacode lang=”python” manual=”import%20os%0Aimport%20click%0A%0A%40click.command()%0A%23%20basic%20options%0A%40click.option(‘–name’%2C’-n’%2C%20default%3D%22JOHN%22%2Chelp%3D%22First%20name%22%2Cprompt%3DTrue)%0A%0A%23multiple%20Values%0A%40click.option(‘–hobbies’%2C’-h’%2Chelp%3D%22hobbies%22%2Cnargs%3D2)%0A%40click.option(‘–salary’%2C’-s’%2Chelp%3D%22Monthly%20Salary%22%20%2Ctype%3Dint%2Cnargs%3D2)%0A%0A%23%20multiple%20OPTIONS%0A%23%20use%20-l%20for%20each%20extra%20value%20you%20want%20to%20enter%0A%40click.option(‘–locations’%2C’-l’%2Chelp%3D%22locations%20%20trained%20at%22%2Cmultiple%3DTrue)%0A%0Adef%20main(name%2Chobbies%2Csalary%2Clocations)%3A%0A%20%20%0A%20%20%20click.echo(f%22Hello%20%7Bname%7D%20!%20!%20!%5CnHobbies%20%3A%20%7Bhobbies%7D%5CnSalary%20%3A%20%7Bsalary%7D%22)%0A%20%20%20click.echo(f%22locations%20Trained%20at%20%3A%20%7B’%2C%20′.join(locations)%7D%22)%0A%20%20%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20os.system(%22clear%22)%0A%20%20%20main()” message=”” highlight=”” provider=”manual”/]
من النص السابق نجد أنه لدينا عدد من options و التي تحتوي على معاملات جديدة، فمثلا السطر:
[pastacode lang=”python” manual=”%40click.option(‘–name’%2C’-n’%2C%20default%3D%22JOHN%22%2Chelp%3D%22First%20%0Aname%22%2Cprompt%3DTrue)%0A” message=”” highlight=”” provider=”manual”/]
نجد أن هناك قيمة قياسية للاختيار name والتي تم تحديدها بـقيمة المعامل default وهي JOHN . ولكن ما فائدة المعامل prompt = True ؟ ميزتها بأنها تقوم بطباعة رسالة بإسم الإختيار الذي لم يتم تلقيمه ما إذا يريد المستخدم أن يعطيه قيمة أم لا في حال نسي ذلك . لا تقلق، سنقوم بتجربة جميع الإختيارات عمليا بعد هذه الشرح. جرب أن تشغل البرنامج بالشكل التالي :
[pastacode lang=”bash” manual=”python3%20p1.py” message=”” highlight=”” provider=”manual”/]
ثم اضغط enter.
ستجد أن البرنامج سيقوم بعرض الاختيار name وكأنه يسأل المستخدم اذا يريد إعطاءه قيمة أو يعتمد القيمة الابتدائية المخزنة فيه سلفا. قم بالضغط على زر enter.
[pastacode lang=”bash” manual=”Name%20%5BJOHN%5D%3A%20%0AHello%20JOHN%20!%20!%20!%0AHobbies%20%3A%20()%0ASalary%20%3A%20()%0Alocations%20Trained%20at%20%3A%20%0A” message=”” highlight=”” provider=”manual”/]
أعد تشغيل البرنامج وأعطي الاختيار name قيمة من عندك.
ملاحظه: يمكنك أن تعطي الاختيار name قيمة أثناء التلقيم بسطر الأوامر مباشرة كما يلي:
[pastacode lang=”bash” manual=”python3%20p1.py%20–name%20nasser” message=”” highlight=”” provider=”manual”/]
أو:
[pastacode lang=”bash” manual=”python3%20p1.py%20-n%20nasser” message=”” highlight=”” provider=”manual”/]
بحيث أن name– و n- تعملان نفس الوظيفة تماما حيث أن الأولى ما هي إلا صيغة مطولة عن الأخرى.
أما السطر:
[pastacode lang=”python” manual=”%40click.option(‘–salary’%2C’-s’%2Chelp%3D%22Monthly%20Salary%22%20%2Ctype%3Dint%2Cnargs%3D2)” message=”” highlight=”” provider=”manual”/]
نجد أن هناك معامل nargs=2 ومعناه أن هذا الـ option يحتاج تحديدا لقيمتين ليعمل و يقوم بتخزينها على شكل tuple وكذلك السطر الذي يليه. هنا نستطيع القول أننا استطعنا تخزين قيمتين في option واحد.
لنقم باختبار الـ options بتشغيل البرنامج كالتالي:
[pastacode lang=”bash” manual=”python3%20p1.py%20–name%20nasser%20-h%20coding%20training%20–salary%203000%204000″ message=”” highlight=”” provider=”manual”/]
ستكون المخرجات بالشكل التالي:
[pastacode lang=”bash” manual=”Hello%20nasser%20!%20!%20!%0AHobbies%20%3A%20(‘coding’%2C%20’training’)%0ASalary%20%3A%20(3000%2C%204000)%0Alocations%20Trained%20at%20%3A%20%0A” message=”” highlight=”” provider=”manual”/]
تلميح: إذا أردنا تخزين عدد غير محدد من القيم فما علينا إلا أن نحدد قيمة nargs لتساوي -١ , nargs = -1
و السطر:
[pastacode lang=”python” manual=”%40click.option(‘–locations’%2C’-l’%2Chelp%3D%22locations%20%20trained%20at%22%2Cmultiple%3DTrue)” message=”” highlight=”” provider=”manual”/]
نجد المعامل multiple =True وهو الذي يتيح للمستخدم أن يستخدم الاختيار الواحد أكثر من مرة و تغذيته بقيم مختلفة كما يلي:
[pastacode lang=”bash” manual=”%20python3%20p1.py%20–name%20nasser%20-h%20coding%20training%20–salary%203000%204000%20-l%20UK%20-l%20dubai%20-l%20Kuwait%20-l%20Montreal” message=”” highlight=”” provider=”manual”/]
لاحظ أنه استخدمنا الاختيار l- أو location– أكثر من مرة مع أكثر من قيمة في سطر الأوامر. المخرجات:
[pastacode lang=”bash” manual=”Hello%20nasser%20!%20!%20!%0AHobbies%20%3A%20(‘coding’%2C%20’training’)%0ASalary%20%3A%20(3000%2C%204000)%0Alocations%20Trained%20at%20%3A%20UK%2C%20dubai%2C%20Kuwait%2C%20Montreal%0A” message=”” highlight=”” provider=”manual”/]
و الان، لنقم بكتابة برنامج بسيط يستخدم Arguments بدلا من options بحيث يقوم المستخدم بإدخال اسمه ثم عددين و اسم عملية حسابية add, sub , mul, div.
[pastacode lang=”python” manual=”import%20click%20%2C%20os%0A%0A%0A%40click.command()%0A%0A%40click.argument(%22name%22%2Cdefault%3D%22Dane%20Black%22)%0A%40click.argument(%22number1%22%2Ctype%3Dfloat)%0A%40click.argument(%22number2%22%2Ctype%3Dfloat)%0A%40click.argument(%22method%22)%0Adef%20main(name%2Cnumber1%2Cnumber2%2Cmethod)%3A%0A%20%20%0A%20%20%20click.echo(f%22hello%20%2C%20%7Bname%7D%22)%0A%0A%20%20%20if%20method%20%3D%3D%20%22add%22%3A%0A%20%20%20%20%20%20%20click.echo(f%22%7Bnumber1%7D%20%2B%20%7Bnumber2%7D%20%3D%20%7Bnumber1%2Bnumber2%7D%20%22)%0A%20%20%20elif%20method%20%3D%3D%22sub%22%3A%0A%20%20%20%20%20%20%20click.echo(f%22%7Bnumber1%7D%20-%20%7Bnumber2%7D%20%3D%20%7Bnumber1-number2%7D%20%22)%0A%20%20%20elif%20method%20%3D%3D%20%22mul%22%3A%0A%20%20%20%20%20%20%20click.echo(f%22%7Bnumber1%7D%20X%20%7Bnumber2%7D%20%3D%20%7Bnumber1*number2%7D%20%22)%0A%20%20%20elif%20method%20%3D%3D%20%22div%22%3A%0A%20%20%20%20%20%20%20click.echo(f%22%7Bnumber1%7D%20%2F%20%7Bnumber2%7D%20%3D%20%7Bnumber1%2Fnumber2%7D%20%22)%0A%20%20%20else%3A%0A%20%20%20%20%20%20%20click.echo(%0A%20%20%20%20%20%20%20%20%20%20%20click.style(%22Undefined%20method%20entered%22%2Cfg%3D%22black%22%2Cbg%3D%22red%22)%0A%20%20%20%20%20%20%20)%0A%0Aif%20__name__%20%3D%3D%20’__main__’%3A%0A%20%20%20os.system(%22clear%22)%0A%20%20%20main()%0A” message=”” highlight=”” provider=”manual”/]
المدخلات و المخرجات:
[pastacode lang=”bash” manual=”python3%20arguments.py%20nasser%2011%2022%20add%0A%0Ahello%20%2C%20nasser%0A11.0%20%2B%2022.0%20%3D%2033.0%0A%0A%0Apython3%20arguments.py%20nasser%2011%2022%20sub%0A%0Ahello%20%2C%20nasser%0A11.0%20-%2022.0%20%3D%20-11.0%20%0A%0Apython3%20arguments.py%20nasser%2011%2022%20mul%0A%0Ahello%20%2C%20nasser%0A11.0%20X%2022.0%20%3D%20242.0%20%0A%0Apython3%20arguments.py%20nasser%2011%2022%20div%0A%0Ahello%20%2C%20nasser%0A11.0%20%2F%2022.0%20%3D%200.5%20%0A%0Apython3%20arguments.py%20nasser%2011%2022%20abs%0Ahello%20%2C%20nasser%0AUndefined%20method%20entered%0A” message=”” highlight=”” provider=”manual”/]
ممتاز جدا.
مثال للاستخدام اليومي
الآن بعد أن تعلمنا مهارات عدة في مكتبة click لنقم بكتابة برنامج ممكن أن نستفيد منه يوميًا ولو بشكل بسيط. البرنامج يقوم بنسخ عدد غير محدد من الملفات يدخلها المستخدم في مجلد معين.
أولا لنقم ببعض التحضيرات:
- أنشئ ملفات عدة في نفس مكان تواجد البرنامج file1 file2 file3 (ملاحظة: ممكن للملفات أن تكون من غير امتداد في ماك و لينكس).
- أنشئ مجلد فارغ بنفس مكان تواجد البرنامج و لنسميه dirz.
- سنستخدم مكتبة shutil للوصول لوظيفة نسخ الملفات بشكل سهل باستخدام وظيفة copy.
- لنسمي برنامجنا argf_copyfiles.py.
[pastacode lang=”python” manual=”import%20os%0Aimport%20click%0A%23%20library%20for%20file%20utilities%20like%20copying%20files%0Aimport%20shutil%0A%0A%40click.command()%0A%40click.argument(‘destination’)%0A%23%20-1%20means%20%2B%20%2C%2C%20multiple%20values%20per%20option%0A%40click.argument(‘source’%2Cnargs%3D-1)%0Adef%20main(source%2C%20destination)%3A%0A%20%20%20for%20f%20in%20source%3A%0A%20%20%20%20%20%20%20%23%20copying%20files%20with%20the%20full%20path%20using%0A%20%20%20%20%20%20%20%23%20using%20the%20os.getcwd()%20for%20current%20path%0A%20%20%20%20%20%20%20shutil.copy(str(os.getcwd()%2B%22%2F%22)%2Bf%2Cdestination)%0A%20%20%20%20%20%20%20click.echo(f%22Copied%20%7Bf%7D%20to%20%7Bdestination%7D%22)%0A%0Aif%20__name__%20%3D%3D%20’__main__’%3A%0A%20%20%20os.system(‘clear’)%0A%20%20%20main()%0A” message=”” highlight=”” provider=”manual”/]
المدخلات و المخرجات:
[pastacode lang=”bash” manual=”python3%20argf_copyfiles.py%20%20file1%20file2%20file3%20dirz%2F%0A%0ACopied%20file1%20to%20dirz%2F%0ACopied%20file2%20to%20dirz%2F%0ACopied%20file3%20to%20dirz%2F%0A” message=”” highlight=”” provider=”manual”/]
تأكد من وجود الملفات المنسوخة في داخل الدليل.
حان الوقت الآن لتعلم استخدام ميزة جديدة في مكتبة click وهي المجموعات groups وهي طريقة جميلة لاستدعاء وظائف برامجنا المختلفة عن طريق click. لنقم بذلك عن طريق كتابة برنامج يقوم بعمل هاش hashing لأي نص يدخله المستخدم ثم يقوم باستدعاء أي خوارزمية للهاش. سنستخدم الألوان للمخرجات.
[pastacode lang=”python” manual=”import%20os%20%2C%20click%2C%20hashlib%0A%0A%0A%40click.group()%20%23main%20command%0Adef%20main()%3A%0A%20%20%20print(%22program%20running%20…%22)%0A%0A%23%20subCommands%0A%0A%40main.command()%20%23%20affiliation%20to%20the%20main%20command%0A%40click.argument(‘sha1′)%20%23argument%20for%20sha1%20algorithm%0Adef%20sha_1(sha1)%3A%0A%20%20%20%23%20the%20help%20is%20displayed%20using%20the%20multiline%20comment%0A%20%20%20%22%22%22SHA1%20hashing%22%22%22%0A%20%20%20hash_object%20%3D%20hashlib.sha1(sha1.encode())%0A%20%20%20hash_object%20%3D%20hash_object.hexdigest()%0A%20%20%20click.echo(click.style(f%22%7Bhash_object%7D%22%2Cfg%3D’red’))%0A%0A%40main.command()%20%23%20affiliation%20to%20the%20main%20command%0A%40click.argument(‘md5′)%20%23argument%20for%20md5%20algorithm%0Adef%20md5(md5)%3A%0A%20%20%20%23%20the%20help%20is%20displayed%20using%20the%20multiline%20comment%0A%20%20%20%22%22%22MD5%20hashing%22%22%22%0A%20%20%20hash_object%20%3D%20hashlib.md5(md5.encode())%0A%20%20%20hash_object%20%3D%20hash_object.hexdigest()%0A%20%20%20click.echo(click.style(f%22%7Bhash_object%7D%22%2Cfg%3D’green’))%0A%0A%40main.command()%20%23%20affiliation%20to%20the%20main%20command%0A%40click.argument(‘sha256′)%20%23argument%20for%20sha256%20algorithm%0A%23%20the%20help%20is%20displayed%20using%20the%20multiline%20comment%0Adef%20sha_256(sha256)%3A%0A%20%20%20%22%22%22256%20hashing%22%22%22%0A%20%20%20hash_object%20%3D%20hashlib.sha256(sha256.encode())%0A%20%20%20hash_object%20%3D%20hash_object.hexdigest()%0A%20%20%20click.echo(click.style(f%22%7Bhash_object%7D%22%2Cfg%3D’yellow’))%0A%0Aif%20__name__%20%3D%3D%20’__main__’%3A%0A%20%20%20os.system(‘clear’)%0A%20%20%20main()%0A” message=”” highlight=”” provider=”manual”/]
شكل شاشة المساعدة:
[pastacode lang=”bash” manual=”Usage%3A%20groups_hash.py%20%5BOPTIONS%5D%20COMMAND%20%5BARGS%5D…%0A%0AOptions%3A%0A%20%20–help%20%20Show%20this%20message%20and%20exit.%0A%0ACommands%3A%0A%20%20md5%20%20%20%20%20%20MD5%20hashing%0A%20%20sha-1%20%20%20%20SHA1%20hashing%0A%20%20sha-256%20%20256%20hashing%0A” message=”” highlight=”” provider=”manual”/]
شكل المدخلات و المخرجات:
نلاحظ التالي من شكل تنفيذ البرنامج :
- الأمر group هو الأمر الشامل و يكتب عند الدالة الرئيسية main، والتي تندرج تحته الأوامر الأخرى التي كتبت فوق الدوال مع المعطيات الخاصة بها.
- لابد من ربط التبعية الدوال الفرعية بالرئيسية main بكتابة ()command@.
- أننا استدعينا الدوال التي كتبناها بإسمها مباشرة من سطر الأوامر.
- قامت click باستبدال “_” بـ “-” بأسماء الدوال.
- المعطيات تقوم بتغذيتها مباشرة تبعا للدوال التابعة لها عند استدعائها.
في المثال السابق استخدمنا مكتبة hashlib واستخدمنا وظائف تفعيل خوارزميات الهاش md5 ,sha1 , sha256، وأنشئنا دوال لكل خوارزمية، وجعلنا group للدالة الرئيسية main، ومن ثم ربطنا الدوال الأخريات بـ main عن طريق ()main.command@، و لكل واحدة منها معطى خاص بها تستخدم قيمته لعمل الهاش وعرضه بلون مميز.
وفي الختام نتمنى أن تكون المقالة قد حازت على رضاكم، حيث شرحنا فيها مكتبة click التي تعتبر مكتبة جميله و ثرية جدا و سهلة الاستخدام لبناء برامج CLI بشكل ممتع و تفاعلي أكثر من مكتبتي optparse و argparse القياسيتين.
مقالات مشابهة
تطبيقات لغة بايثون في إنترنت الأشياء
مكتبة Playwright – بديل مايكروسوفت لأتمتة متصفحات الإنترنت
قواعد البيانات الأوراكل والبايثون –كيف نتعامل مع الاوراكل من كود بايثون
مكتبة requests في البايثون – كيف تُرسل طلبات HTTP من بايثون