Command line arguments

  • Författare
  • Meddelande
Användarvisningsbild

maulinglawns

html-guru

  • Inlägg: 64
  • Blev medlem: 19 jan 2015, 11:11

Command line arguments

Inlägg24 jan 2015, 19:32

Hej!

Höll på att fila på den här övningen i kursboken (http://pythonlearn.com):
pythonlearn skrev:The following program counts the number of times the letter a appears in a string:

word = 'banana'
count = 0
for letter in word:
if letter == 'a':
count = count + 1
print count

This program demonstrates another pattern of computation called a counter. The variable count is initialized to 0 and then incremented each time an a is found. When the loop exits, count contains the result—the total number of a’s.
Exercise 3

Encapsulate this code in a function named count, and generalize it so that it accepts the string and the letter as arguments.


När jag hade gjort det, och anropat funktionen "inuti" själva skriptet:
Kod: Markera allt
count(foo o)


Så kom jag att undra om det inte vore bättre att kunna köra direkt med argument från skalet (eller terminalen on ni så vill). Eftersom Internet hade dött hemma just då var jag tvungen att köra
Kod: Markera allt
help(sys)


för att komma på hur man skickar argument till ett Pythonskript. Sen började jag expandera min funktion, och när jag ändå var i farten ville jag ha möjligheten att ignorera versaler, jämför:
Kod: Markera allt
grep -i


Nåväl, det hela slutade med följande program:
Kod: Markera allt
#!/usr/bin/env python3

def helpText():
    """
    Print info on how to use program.
    """
    text = """
    charCount
    A simple program that counts occurances of char in word.

    Basic usage:
    1. charCount foo o
    There are 2 occurances of
    o in foo.

    2. charCount "mississippi" s
    There are 4 occurances of
    s in mississippi.

    Flags:
    '-i' ignore case

    '--help'
    Show this text.
    """

    print(text)
    sys.exit(0)
     
def main():
    """
    A simple program that takes two command line arguments,
    a WORD and a CHAR.
    Then count occurances of CHAR in WORD.

    Exit codes:
    0 - Success
    1 - Error. Wrong number of arguments.
    2 - Error. Wrong flag.
    """
    import sys

    ignoreCase = ""
    word = ""
    letter = ""

    # Use command line arguments to function with:
    # sys.argv see 'help(sys)'
    if len(sys.argv) == 2 and sys.argv[1] == "--help":
        helpText()
    elif len(sys.argv) < 3 or len(sys.argv) > 4:
        print("Usage: " + str(sys.argv[0]) + " [-i] word letter")
        print("See charCount --help for info")
        sys.exit(1)
    elif len(sys.argv) == 3:
        word = sys.argv[1]
        letter = sys.argv[2]
    elif len(sys.argv) == 4:
        if sys.argv[1] != "-i":
            print("Unrecognized flag " + str(sys.argv[1]))
            print("See charCount --help for info")
            sys.exit(2)
        ignoreCase = sys.argv[1]
        word = sys.argv[2]
        letter = sys.argv[3]

    # Check for flag '-i'. If so ignore case
    if sys.argv[1] == "-i":
        ignoreCase = sys.argv[1]

    if ignoreCase == "-i":
        lowWord = word.lower()
        lowLetter = letter.lower()
        count = 0
        for char in lowWord:
            if char == lowLetter:
                count += 1
    else:
        count = 0
        for char in word:
            if char == letter:
                count += 1

    print("There are " + str(count) + " occurances of")
    print(letter + " in " + word + ".")
       
    sys.exit(0)

main()


Exempel på exekvering (jag har placerat mitt skript i min $PATH):
Kod: Markera allt
magnus@debian7:~$ charCount.py foo O
There are 0 occurances of
O in foo.

Kod: Markera allt
magnus@debian7:~$ charCount.py -i foo O
There are 2 occurances of
O in foo.

Kod: Markera allt
magnus@debian7:~$ charCount.py -i "Apex Predator - Easy Meat" e
There are 4 occurances of
e in Apex Predator - Easy Meat.

Kod: Markera allt
magnus@debian7:~$ charCount.py foo
Usage: /usr/local/bin/charCount.py [-i] word letter
See charCount --help for info
magnus@debian7:~$ echo $?
1

Kod: Markera allt
magnus@debian7:~$ charCount.py - foo f
Unrecognized flag -
See charCount --help for info
magnus@debian7:~$ echo $?
2

Kod: Markera allt
magnus@debian7:~$ charCount.py --help

    charCount
    A simple program that counts occurances of char in word.

    Basic usage:
    1. charCount foo o
    There are 2 occurances of
    o in foo.

    2. charCount "mississippi" s
    There are 4 occurances of
    s in mississippi.

    Flags:
    '-i' ignore case

    '--help'
    Show this text.


Det här behövs alltså inte för den här övningen, men jag tyckte att det var lite spännande att prova att köra med argument direkt från skalet, och tänkte bara dela med mig av detta.

Nu ska jag fortsätta göra det jag egentligen skulle göra...

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 15 gäster