الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

معالجة الoptions الممررة لبرنامجك في سطر الأوامر

بدأه ahmed_youssef في 21 أبريل 2013 · 8 رد · 1,584 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
مؤكد أنك قمت بإستخدام options لبرنامج أثناء أستخدامه في سطر الأوامر أو حتى قمت بإستخدام -v او --version لبعض التطبيقات لترى رقم الإصدار

 

[striky@localhost mywspace]$ python --version

Python 2.7.3

أو حتى قمت بإستخدام خاطئ لبرنامج ما فظهرت لك رسالة لتوضح كيفية إستخدام البرنامج من سطر الأوامر

[striky@localhost mywspace]$ grep -x

Usage: grep [OPTION]... PATTERN [FILE]...

Try 'grep --help' for more information.

او تستدعي --help للإطلاع على طرق الإستخدام التفصيلية الصحيحة

[striky@localhost mywspace]$ grep --help

Usage: grep [OPTION]... PATTERN [FILE]...

Search for PATTERN in each FILE or standard input.

PATTERN is, by default, a basic regular expression (BRE).

Example: grep -i 'hello world' menu.h main.c

 

....

....

كيف تعالج معاملات برنامجك في سطر الأوامر ؟

بالطبع تستطيع التفكير في معالجة معاملات سطر الأوامر في sys.argv! هذا تفكير صحيح ولكن يوجد عدة طرق قياسية سنتعرض لبعضهامع بعض الأمثلة

 

هذه أولا بعض الأمثلة التي سنتعرض لها في الشرح

cmds=["flask -c users", "flask --controller users", "flask --controller=users", 

      "flask -m post",  "flask --model post", "flask --model=post",

      "flask -v", "flask --version"

]

فكما ترى هنا عدة أمثلة لمعاملات مختلفة يتم تمريرها للبرنامج بإستخدام options مختلفة ك -c و --controller و -m و --model و -v و --version

 

بداية يوجد نوعان للتسمية ، تسمية الإختيار بإسم قصير مثل c,m,v وتكون مسبوقة ب - ويوجد تسمية بإسم طويل مثل controller, model, version وتكون مسبوقة ب --

 

 

1- getopt, getopt_long

 

يوجد عدة دوال شهيرة في عالم يونكس لمعالجة (إختيارات options ) سطر الأوامر

*لاحظ أنني سأستخدم كلمة تحويلة switch او أختيار option بصورة متبادلة لافارق لها في هذا الشرح

 

بايثون توفر لنا مكتبة تسمى getopt لتساعدنا في هذه المسألة ، كل مانحتاجه منها هو دالة getopt

from getopt import getopt

أنظر لمعاملات برنامجك وال options التي تريد أن يوفرها برنامجك 

نريد أن يكون لدينا options في الصورة المصغرة تسمى c, m, v 

    flask_shortopts="vc:m:"

مامعنى الcolon بعد c و m ؟

هي تعني ان هذا ال option سيحتاج لقيمة أثناء التنفيذ

 

نريد أن يكون لدينا options في الصورة المطولة تسمى controller, model, version

    flask_longopts=["version", "model=", "controller="]

هل هل تستطيع تخمين فائدة = ؟

كما سبق فوظيفتها أن تخبر getopt ان معاملات مثل controller و model ستحتاج لقيمة أثناء التنفيذ

 

 

def parse_getopt(s):

    flask_shortopts="vc:m:"

    flask_longopts=["version", "model=", "controller="]

 

    print "[+]geopt parsing %s"%s

    print "-------------"

    optsv=get_optsv(s)

    

    parsed, remainder = getopt(optsv, flask_shortopts, flask_longopts)

    for opt, arg in parsed:

        print "option: %s, arg:%s"%(opt,arg)

    

    

    print "[+]complete"

 

كل الجديد هو دالة get_optsv ، وهي تقوم بالحصول على معاملات البرنامج بدون إسم البرنامج كمكافئ ل

sys.argv[1:]

وهي معرفة كالتالي 

get_optsv= lambda s : s.split()[1:]

 

المهم لنا هو كيفية تنفيذ getopt

parsed, remainder = getopt(optsv, flask_shortopts, flask_longopts)

 

هي تأخذ عدة معاملات ، الأول هو مصفوفة تعبر عن معاملات البرنامج "بدون إسم البرنامج" والثاني ال options في الصورة المصغرة والثالث ال options في الصورة المطولة

وتقوم بإعادة جزئين ، ماتم معالجته والباقي الذي لم يتم معالجته

    for opt, arg in parsed:

        print "option: %s, arg:%s"%(opt,arg)

نقول بعمل دوارة صغيرة على ماتم معالجته وهي عبارة عن زوج مكون من الإختيار وقيمته إذا كان له قيمة 

لتنفيذها على الجميع

 

map(parse_getopt, cmds)

[striky@localhost ~]$ python getoptsexamples.py 

[+]geopt parsing flask -c users

-------------

option: -c, arg:users

[+]complete

[+]geopt parsing flask --controller users

-------------

option: --controller, arg:users

[+]complete

[+]geopt parsing flask --controller=users

-------------

option: --controller, arg:users

[+]complete

[+]geopt parsing flask -m post

-------------

option: -m, arg:post

[+]complete

[+]geopt parsing flask --model post

-------------

option: --model, arg:post

[+]complete

[+]geopt parsing flask --model=post

-------------

option: --model, arg:post

[+]complete

[+]geopt parsing flask -v

-------------

option: -v, arg:

[+]complete

[+]geopt parsing flask --version

-------------

option: --version, arg:

[+]complete

 

2- optparse

بايثون تقدم مكتبة اخرى تحت إسم optparse ، مانحتاجه منها هو OptionParser

 

from optparse import OptionParser

 

def parse_optparse(s):

    print "[+]optparse parsing %s"%s

    print "-------------------"

    optsv=get_optsv(s)

    

    p=OptionParser()

    p.add_option("-v", "--version", action="store_true", dest="version", default=False)

    p.add_option("-c", "--controller", action="store", dest="controller")

    p.add_option("-m", "--model", action="store", dest="model")

    

 

    options, args=p.parse_args(optsv)

    print "options: %s"%str(options)

    print "args: %s"%str(args)

    

    print "[+]complete"

 

    p.add_option("-m", "--model", action="store", dest="model")

 

هنا نقوم بتسجيل الoption في الصورة الصغرى والمطولة و dest تعبر عن اسم ال attribute التي نريد التعامل معها (ويفضل أن يكون مثل الصورة المطولة للوضوح)

print options.model

إستخدام store كقيمة ل action هو الإفتراضي وتستطيع حذفه ولكن الفائدة منه هو تنفيذ فعل معين عن رؤية ذلك الإختيار في المعاملات وهنا الفعل المطلوب تسجيل قيمة ذلك الإختيار في متغير يسمى model

 

يوجد action آخر يسمى store_true ويقوم بتخزين قيمة True في متغير حسب ال dest كما في مثال version بمجرد رؤيته في المعاملات

 

p.add_option("-v", "--version", action="store_true", dest="version", default=False)

 

ويوجد كذلك store_false يقوم بتخزين قيمة False في متغير حسب ال dest بمجرد رؤية ذلك الإختيار في المعاملات

 

*القيمة default تستخدم لتحديد القيمة الإفتراضية 

تستطيع تمرير قيمة ل help ليتم عرضها عند إستدعاء ال help

 

*قمت بإضافة أمرين تعلم optparse كيف تعالجهم مباشرة

cmds_extra = cmds + ['flask -h', 'flask --help']

 

أنظر للخرج

[striky@localhost ~]$ python getoptsexamples.py 

[+]optparse parsing flask -c users

-------------------

options: {'controller': 'users', 'version': False, 'model': None}

args: []

[+]complete

[+]optparse parsing flask --controller users

-------------------

options: {'controller': 'users', 'version': False, 'model': None}

args: []

[+]complete

[+]optparse parsing flask --controller=users

-------------------

options: {'controller': 'users', 'version': False, 'model': None}

args: []

[+]complete

[+]optparse parsing flask -m post

-------------------

options: {'controller': None, 'version': False, 'model': 'post'}

args: []

[+]complete

[+]optparse parsing flask --model post

-------------------

options: {'controller': None, 'version': False, 'model': 'post'}

args: []

[+]complete

[+]optparse parsing flask --model=post

-------------------

options: {'controller': None, 'version': False, 'model': 'post'}

args: []

[+]complete

[+]optparse parsing flask -v

-------------------

options: {'controller': None, 'version': True, 'model': None}

args: []

[+]complete

[+]optparse parsing flask --version

-------------------

options: {'controller': None, 'version': True, 'model': None}

args: []

[+]complete

[+]optparse parsing flask -h

-------------------

Usage: getoptsexamples.py [options]

 

Options:

  -h, --help            show this help message and exit

  -v, --version         

  -c CONTROLLER, --controller=CONTROLLER

  -m MODEL, --model=MODEL

 

آخر جزئية هي خرج استدعاء -h على البرنامج سنعرضها بصورة منفصلة

[+]optparse parsing flask -h

-------------------

Usage: getoptsexamples.py [options]

 

Options:

  -h, --help            show this help message and exit

  -v, --version         

  -c CONTROLLER, --controller=CONTROLLER

  -m MODEL, --model=MODEL

 

3- argparse

هي المكتبة المعتمدة وسيتم إنهاء optparse لصالحها

 

 

def parse_argparse(s):

    print "[+]argparse parsing %s"%s

    print "-------------------"

    

    optsv=get_optsv(s)

    

    p=ArgumentParser()

    p.add_argument("-v", "--version", help="prints version", action="store_true", default=False)

    p.add_argument("-c", "--controller", help="generate controller",dest="controller")

    p.add_argument("-m", "--model", help="generate model", dest="model")

    

 

    

    args=p.parse_args(optsv)

    print "args: %s"%str(args)

    

    print "[+]complete"

 

[striky@localhost ~]$ python getoptsexamples.py 

[+]argparse parsing flask -c users

-------------------

args: Namespace(controller='users', model=None, version=False)

[+]complete

[+]argparse parsing flask --controller users

-------------------

args: Namespace(controller='users', model=None, version=False)

[+]complete

[+]argparse parsing flask --controller=users

-------------------

args: Namespace(controller='users', model=None, version=False)

[+]complete

[+]argparse parsing flask -m post

-------------------

args: Namespace(controller=None, model='post', version=False)

[+]complete

[+]argparse parsing flask --model post

-------------------

args: Namespace(controller=None, model='post', version=False)

[+]complete

[+]argparse parsing flask --model=post

-------------------

args: Namespace(controller=None, model='post', version=False)

[+]complete

[+]argparse parsing flask -v

-------------------

args: Namespace(controller=None, model=None, version=True)

[+]complete

[+]argparse parsing flask --version

-------------------

args: Namespace(controller=None, model=None, version=True)

[+]complete

[+]argparse parsing flask -h

-------------------

usage: getoptsexamples.py [-h] [-v] [-c CONTROLLER] [-m MODEL]

 

optional arguments:

  -h, --help            show this help message and exit

  -v, --version         prints version

  -c CONTROLLER, --controller CONTROLLER

                        generate controller

  -m MODEL, --model MODEL

                        generate model

للمزيد

 




 

 

الأمثلة ستجدها هنا 

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#2

وهل يجوز ارفاقها في المشروع ,, لكي عندما يريد المستخدم معرفة اﻻصدار ووو ويخطأ يخرج له القيم اﻻخرى

تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 21 أبريل 2013 في 15:46

salah.jpg

#3

لم أفهم قصدك بالضبط، تتحدث عن إرفاق مكتبات مثل getopt و optparse و argparse ؟

إذا هذا سؤالك فهي مكتبات قياسية في بايثون تعمل في أي مكان يوجد فيه بايثون :)

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#4

ﻻ ليس عذا سؤالي

 

اذا ﻻحضت عندما  كتبت امر معرفة اصدار بايثون خرج لك,

 

فــ يعني  اذا  وضعت هذه الدالة في مدونة التي اعمل عليها

 

 

وكتبت امر استخراج الاصدار هل يجوز ام ﻻ

salah.jpg

#5

حقيقة لاأفهم ماذا تعني بهل يجوز أو لايجوز ؟ عما تتحدث!؟ فضلا أكتب كلام تفصيلي 

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#6

اعتذؤ اصلا انا ايضا اخطأت في سؤالي هذا ,, ﻻني كنت اقصد شيئا اخر ليس له دخل في الموضوع ,

 

 

سؤالي : متى تستخدم  هذه الطريقة وفي اي حالة

 

والسؤال اﻻخر : ماوضيفة دالة getopt لم تتوضح لدي عندما قلت تقوم بمعالجة البيانات اي اي ماذا تفعل !

تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 21 أبريل 2013 في 18:46

salah.jpg

#7

تستخدمها إذا كان تطبيقك يعمل في سطر الأوامر بصورة عامة 

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#8

وجدت هذا الفيديو 

http://www.youtube.com/watch?v=pXhcPJK5cMc

 

 

http://docopt.org/

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#9

موضوع رائع و شرح أروع أخي أحمد

حقيقة لم أكن على علم بهته المكتبات فقد كنت دوما أقوم بالمعالجة عن طريق sys.argv.

هذا ما اعشقه في بايثون،توجد العديد من الحلول لمشكل واحد،أشكرك أخي احمد على الموضوع الرائع،تقبل تحيات أخيك عبد المجيد

أضخم دورة تعليم إختبار الإختراق في العالم العربي


هاكركاديمي


نصلح ما أفسده المخربون

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…