Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

תיכנות בלינוקס - איך כותבים command line interface

Anonymous - 09/10/2007 - 01:21
נושא ההודעה: איך כותבים command line interface
אני מנסה לכתוב command line interface (איך אומרים/כותבים את זה בעברית?), אבל אני לא ממש מצליח. אני יודע שזה אמור להיות פשוט אבל בגלל שאני משתמש ב-python כל קוד שאני כותב יוצר לי הרבה פעמים קוד לא קריא או קוד לא פיתונאי מספיק עם שימוש מוגזם לפעמים ביוצאים מן הכלל (Exceptions) . יש איזה שהיא דרך ליצור קוד לא מסובך שיתן לי אפשרות להכין דגלים עם כל המאפיינים שיש לי ל-command line interface בשפה. למשל להכין קלאס שיחזיק את כל הדגלים ואני רק אצטרך לקרוא להם בסיטואציה המתאימה?
mksoft - 09/10/2007 - 01:27
נושא ההודעה:
getopt הישן יותר:
http://blog.doughellmann.com/2007/08/pymotw-getopt.html

optparse המשופר:
http://blog.doughellmann.com/2007/08/pymotw-optparse.html

שניהם בספריה הסטנדרטית.
Anonymous - 09/10/2007 - 01:38
נושא ההודעה:
תודה זה מאוד עוזר, רק רציתי לשאול בקשר לאלגוריתם עצמו?
mksoft - 09/10/2007 - 01:45
נושא ההודעה:
לא הבנתי את השאלה, איזה אלגוריתם, לממש בעצמך ?

אם כן, האם אתה מעביר רק דגלים, או גם פרמטרים יחד עם הדגלים ? אופציות עם שמות ארוכים ( -- ) או רק שמות קצרים ( - ) ?
Anonymous - 09/10/2007 - 01:47
נושא ההודעה:
רק פרמטרים, אני רוצה פשוט לקחת את הטקסט ולהוציא ממנו את הדגל ואז להתייחס למה שבא אחריו בתור הקלט שקשור לדגל.
mksoft - 09/10/2007 - 01:51
נושא ההודעה:
אז זה לא רק פרמטרים, זה דגלים עם פרמטרים. עבור התוכנה תמיד צריך לבוא פרמטר לאחר כל דגל או שהוא אופציונלי ?
Anonymous - 09/10/2007 - 02:01
נושא ההודעה:
יודע מה אני אפרט.
אני כותב תוכנה שהיא בעצם HTML Generator. היא לוקחת טקסט שאתה כותב והופכת אותו לדף HTML יחד עם עיצוב. הממשק צריך לפחות שלושה דגלים אחד -o ל-output של ה-HTML. שני -i בשביל input. והשלישי לבחירת העיצוב -t ל-template למשל, מספר בין 1-5. כאשר סשן רגיל עם התוכנה צריך להיות משהו כזה program -o index.html -i story.txt -t 3 משהו בסגנון למרות שהספריה שנתת לי קודם עושה את התפקיד הזה מצוין ואני מודה לך עליה אני פשוט רוצה להבין איך לעשות את זה בעצמי.
mksoft - 09/10/2007 - 02:33
נושא ההודעה:
תודה על הפירוט, חוסך המון שאלות.

תמיד אפשר להסתכל בקוד המקור של הספריות הנ"ל Wink. בכל מקרה הנה משהו בסגנון המבוקש:
קוד:
#!/usr/bin/env python
import sys

OPTS = {
    '-i' : {'help':'Input file', 'value':None},
    '-o' : {'help':'Output file', 'value':None},
    '-t' : {'help':'Template number', 'value':None }
}

def description_and_exit():
    """ Print  usage and exit with an error value """
    print "Usage: ", sys.argv[0], "[options]\n"
    print '\n'.join(
        ["\t%s : %s " % (opt[0],opt[1]['help']) for opt in OPTS.items()] 
    )
    sys.exit(1)

# get the options (omiting the  first one of argv) as a list of pairs
opt_pairs = zip(sys.argv[1::2], sys.argv[2::2])

# we must have 3 pairs
if len(opt_pairs) < 3:
    description_and_exit()

# make sure the opt is in the keys of OPTS, is so update the dict's value
for opt,value in opt_pairs:
    if not opt in OPTS.keys():
        description_and_exit()

    OPTS[opt]['value'] = value

# now we got the values in our OPTS, let's print them
for key,value in OPTS.items():
    print "%s : %s" % (key, value['value'])


דוגמא להרצה:
קוד:
$  ./test.py -o yo.html -i b.txt -t
Usage:  ./test.py [options]

        -t : Template number
        -o : Output file
        -i : Input file

$ ./test.py -o yo.html -i b.txt -t 5
-t : 5
-o : yo.html
-i : b.txt

mksoft - 09/10/2007 - 11:29
נושא ההודעה:
עוד הערה לגבי הקוד הנ"ל:

הוא לא יתפוס מקרה שמשתמש מעביר פעמיים אותו דגל, לכן בלולאה יש לבדוק אם הערך של value עבור הדגל הנ"ל כבר מכיל משהו. אם כן, לקרוא ל-description_and_exit.
Anonymous - 09/10/2007 - 11:39
נושא ההודעה:
ואוו ממש תודה!
mksoft - 10/10/2007 - 01:16
נושא ההודעה:
בבקשה Smile אך כמובן שעדיף הרבה יותר להשתמש בספריות הסטנדרטיות Rolling Eyes
mksoft - 05/11/2007 - 13:32
נושא ההודעה:
אתה מקשר בתמימות לעמוד ופתאום כותבים עליך Smile (תודה לעידו על הקישור, אין לי זמן לאחרונה לקרוא אפילו פידים):

http://blog.doughellmann.com/2007/11/see-who-is-linking-to-you.html

בכל מקרה, כמו שציינתי לעיל, הקוד הנ"ל לא יתפוס מקרה של העברת אותו פרמטר יותר מפעם אחת, אז הנה הקוד המתוקן (תוקנה שורת ה-if בתוך הלולאה):

קוד:
#!/usr/bin/env python
import sys

OPTS = {
    '-i' : {'help':'Input file', 'value':None},
    '-o' : {'help':'Output file', 'value':None},
    '-t' : {'help':'Template number', 'value':None }
}

def description_and_exit():
    """ Print  usage and exit with an error value """
    print "Usage: ", sys.argv[0], "[options]\n"
    print '\n'.join(
        ["\t%s : %s " % (opt[0],opt[1]['help']) for opt in OPTS.items()] 
    )
    sys.exit(1)

# get the options (omiting the  first one of argv) as a list of pairs
opt_pairs = zip(sys.argv[1::2], sys.argv[2::2])

# we must have 3 pairs
if len(opt_pairs) < 3:
    description_and_exit()

# make sure the opt is in the keys of OPTS, is so update the dict's value
for opt,value in opt_pairs:
    if not opt in OPTS.keys() or OPTS[opt].get('value', None):
        description_and_exit()

    OPTS[opt]['value'] = value

# now we got the values in our OPTS, let's print them
for key,value in OPTS.items():
    print "%s : %s" % (key, value['value'])

כל הזמנים הם GMT + 2 שעות