Search code examples
pythoncommand-linepython-3.xarguments

How to add command line arguments with flags in Python3?


I have to input the parameters from the command line i.e username, password, and database name. I know how to do that without using flags, by using sys.argv like below:

##Test.py
hostname = str(sys.argv[1])
username = str(sys.argv[2])
password = str(sys.argv[3])

def ConnecttoDB():
    try:
        con=sql.connect(host=hostname, user= username, passwd= password)
        print ('\nConnected to Database\n')

# If we cannot connect to the database, send an error to the user and exit the program.
    except sql.Error:
        print ("Error %d: %s" % (sql.Error.args[0],sql.Error.args[1]))
        sys.exit(1)

    return con   

So, it could be run as:

$test.py DATABASE USERNAME PASWORD

But the problem is that I have to use 'flags'. So, the script could be run like this:

$test.py -db DATABSE -u USERNAME -p PASSWORD -size 20

How can I use flags to take arguments from the command line?


Solution

  • First of all thanks to Mark for 'argparse' code. I have figured out the way to take arguments from command line specified by flags. I am pasting the code below which uses a modified 'Mark' code and a small module that shows how to use the arguments collected via commandline:

    import argparse
    
    parser = argparse.ArgumentParser()
    
    #-db DATABASE -u USERNAME -p PASSWORD -size 20000
    parser.add_argument("-host", "--hostname", dest = "hostname", default = "xyz.edu", help="Server name")
    parser.add_argument("-db", "--database", dest = "db", default = "ding_dong", help="Database name")
    parser.add_argument("-u", "--username",dest ="username", help="User name")
    parser.add_argument("-p", "--password",dest = "password", help="Password")
    parser.add_argument("-size", "--binsize",dest = "binsize", help="Size", type=int)
    
    args = parser.parse_args()
    
    print( "Hostname {} db {} User {} Password {} size {} ".format(
            args.hostname,
            args.db,
            args.username,
            args.password,
            args.binsize
            ))
    def ConnectToDB():
        print ('Trying to connect to mySQL server')
        # Try to connect to the database
        try:
            con=sql.connect(host=args.hostname, user= args.username, passwd= args.password)
            print ('\nConnected to Database\n')
    
        # If we cannot connect to the database, send an error to the user and exit the program.
        except sql.Error:
            print ("Error %d: %s" % (sql.Error.args[0],sql.Error.args[1]))
            sys.exit(1)
    
        return con
    

    One of my concerns was how to use variables from arguments to the code. For that two things need to be done

    1. Add 'dest' to the add_argument line e.x. dest ="username" which means the value collected from the command line will be assigned to variable 'username'
    2. Whenever an you use such command line assigned variables from 'dest' just add 'args' before variable e.x con=sql.connect(host=args.hostname, user= args.username, passwd= args.password)