Kmom06, Marvin5, ping och quote

  • Författare
  • Meddelande

Signe.Liden

html-kodare

  • Inlägg: 16
  • Blev medlem: 29 aug 2016, 09:33

Kmom06, Marvin5, ping och quote

Inlägg12 okt 2016, 10:07

Hej.
Sliter mitt hår här hemma angående kmom06, närmare bestämt hur jag ska bygga upp programmet.

Här är uppgiften i stora drag:
Du skall du göra en kommandorads-version av Marvin. Du skall skicka in argument, eller options, på kommandoraden och därmed styra vad Marvin gör.

Så här kan det se ut.

# Generell användning av Marvin
./marvin-cli.py [options] command [arguments-to-the-command]

# Visa en hjälptext till vad din Marvin kan göra
./marvin-cli.py --help

# Pinga en webbsida med din Marvin
./marvin-cli.py ping http://dbwebb.se/humans.txt


I exempelfilen från Mos fanns det ju bara en egentlig funktion, nämligen printMyName().

Så jag förstår inte följande:

1. Var ska jag ange vilken funktion som ska köras? Vill ju lägga en "if ping in opts, kör ping()" i main, men får det inte att funka.

2. Däremot funkar det om jag gör ping-kommandot som en flagga och lägger "if ping" i parseOptions-definitionen. Varför?

3. Hur anger man saker som inte ska vara flaggor utan bara val, som "ping"? Och var?

Bifogar koden nedan. (Kunde inte publicera eftersom den innehåller fel.) Det är tyvärr något av ett hopkok av exempel från olika håll.

Hjälp mig gärna. Känner att det här håller på att bli övermäktigt nu.

(Hade gärna labbat med de här grejerna innan vi gick rakt på uppgifterna. Dessutom hade det just i den här övningen hade det varit guld med ett fungerande ramprogram som gjorde the basics.)

MVH Signe, sili16




Kod: Markera allt
#!/usr/bin/env python3
#-*- coding: utf-8 -*-

"""
Example to show how command-line options can be handled by a script.
"""

### Ping ska ta ett argument. XXX


import sys
import os
import time
import requests
from datetime import datetime
import getopt



#
# Add some stuff about this script
#
PROGRAM = os.path.basename(sys.argv[0])
AUTHOR = "Signe Liden"
EMAIL = "signe.liden@gmail.com"
VERSION = "1.0"
USAGE = """{program} - Print my name. By {author} ({email}), version {version}.


Usage:
  {program} [options] argument

Options:
  -h --help                      Display this help message.
  -v --version                   Print version and exit.
  --verbose                      Prints more about the execution.
  -s, --silent                   Prints nothing about the execution.
  ping=                          Checks if a site is online and when it was last modified.
  argument                       Your argument.
""".format(program=PROGRAM, author=AUTHOR, email=EMAIL, version=VERSION)


MSG_VERSION = "{program} version {version}.".format(program=PROGRAM, version=VERSION)
MSG_USAGE = "Use {program} --help to get usage.\n".format(program=PROGRAM)


#
# Global default settings affecting behaviour of script in several places
#

SILENT = False
VERBOSE = True
ARGUMENT = ""

EXIT_SUCCESS = 0
EXIT_USAGE = 1
EXIT_FAILED = 2

def printUsage(exitStatus):
    """
    Print usage information about the script and exit.
    """
    print(USAGE)
    sys.exit(exitStatus)



def printVersion():
    """
    Print version information and exit.
    """
    print(MSG_VERSION)
    sys.exit(EXIT_SUCCESS)


def parseOptions():
    """
    Merge default options with incoming options and arguments and return them as a dictionary.
    """

    # Switch through all options
    try:
        global SILENT, VERBOSE

        opts, args = getopt.getopt(sys.argv[1:], "hvsvqp", ["help", "version", "silent", "verbose", "quote", "ping"])

        for opt, arg in opts:
            print(opt, arg)
            if opt in ("-h", "--help"):
                printUsage(EXIT_SUCCESS)

            elif opt in ("-v", "--version"):
                printVersion()

            elif opt in ("-s", "--silent"):
                SILENT = True

            elif opt in ("--verbose"):
                VERBOSE = True

##            elif opt in ("--quote"):
##                quote()
##
##            elif opt in ("--ping", "--PING, --Ping, ping"):
##                ping()

            else:
                assert False, "Unhandled option"

        if len(args) != 1:
            assert False, "Missing argument"

        # Something passed as a required argument
        global ARGUMENT
        ARGUMENT = args[0]

    except Exception as err:
        print(err)
        print(MSG_USAGE)
        # Prints the callstack, good for debugging, comment out for production
        #traceback.print_exception(Exception, err, None)
        sys.exit(EXIT_USAGE)

def ping():
    """
    Example of how to ping a webpage for a status code, basically just
    to check that the page is there and the webserver is replying with
    a positive code, such as 200.
    """
    print(__doc__)

    url = "https://dbwebb.se/humans.txt"

    try:

        # Get current time
        rTime = time.ctime(time.time())

        # Request header from url
        print("Ready to send HTTP request to ", url, "\n(press return)")
        input()
        req = requests.head(url)

            # Print result
        if SILENT:
            pass
        else:
            print("Request to ", url, " sent at ", rTime)

        print("Recieved status code: ", req.status_code)

        if SILENT:
            pass
        else:
            print("Page was last modified: ", req.headers["Last-Modified"])

    except requests.ConnectionError:

        print("Failed to connect")

def quote():

    """
    Get a random quote from a webservice and print it out.

    The webservice in the example is:
    http://dbwebb.se/javascript/lekplats/get-marvin-quotes-using-ajax/quote.php
    """

    print(__doc__)
    input("Press enter to continue. ")


    url = "http://dbwebb.se/javascript/lekplats/get-marvin-quotes-using-ajax/quote.php"


    try:

        print("\nReady to send HTTP request to ", url, "\nPress enter to continue. ", end='')
        input()
        req = requests.get(url)

        print("\nThe response status code is:\n", req.status_code)

        print("\nThe response body is:\n", req.text)

        json = req.json()
        print("\nQuote of today is:\n\"{quote}\"\n".format(quote=json["quote"]))


    except requests.ConnectionError:

        print("Failed to connect.")


def main():
    """
    Main function to carry out the work.
    """
    startTime = datetime.now()
   
    parseOptions()

    opts, args = getopt.getopt(sys.argv[1:], "hvsvqp", ["help", "version", "silent", "verbose", "quote", "ping"])

    for opt, arg in opts:
        print(opt, arg)
        if opt in ("ping", "PING", "Ping"):
            ping()

    timediff = datetime.now()-startTime
    if VERBOSE:
        sys.stderr.write("Script executed in {}.{} seconds\n".format(timediff.seconds, timediff.microseconds))

    sys.exit(EXIT_SUCCESS)

if __name__ == "__main__":
    main()

Användarvisningsbild

efo

dbwebb

  • Inlägg: 377
  • Blev medlem: 15 aug 2016, 11:58
  • Ort: Rödeby

Re: Kmom06, Marvin5, ping och quote

Inlägg12 okt 2016, 13:17

Hej Signe,

Du får tillbaka två variabler från din getopt funktion: opts och args. Options (de med - eller -- innan) lägger sig i opts variabeln och Arguments (de utan -) lägger sig i args variabeln.

Prova att göra en print(args) och se vad du får ut i den variabeln.

Det kommer komma upp en kort film på youtube om detta under eftermiddagen.

Signe.Liden

html-kodare

  • Inlägg: 16
  • Blev medlem: 29 aug 2016, 09:33

Re: Kmom06, Marvin5, ping och quote

Inlägg13 okt 2016, 16:31

Tack för videon. Nu blev allt betydligt klarare!

Vilka är online

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