How to add command line arguments with flags in Python3?

43,059

Solution 1

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)

Solution 2

The python 3 library includes 3 modules for parsing the command line thus nothing extra to add to your setup.

The one you should use is argparse

import argparse
parser = argparse.ArgumentParser()

#-db DATABSE -u USERNAME -p PASSWORD -size 20
parser.add_argument("-db", "--hostname", help="Database name")
parser.add_argument("-u", "--username", help="User name")
parser.add_argument("-p", "--password", help="Password")
parser.add_argument("-size", "--size", help="Size", type=int)

args = parser.parse_args()

print( "Hostname {} User {} Password {} size {} ".format(
        args.hostname,
        args.username,
        args.password,
        args.size
        ))
Share:
43,059
Atul Kakrana
Author by

Atul Kakrana

About me, you really want to know. A Biotech Undergraduate who graduated in Biochemistry and took a Job of Linux administrator than decided to do some Molecular Biology research got involved with Bio-Informatics. Worked hard and got two patents and decided to go for PhD in Computational Biology. That's what I am doing now. Strange, That's me. Atul Kakrana.

Updated on January 06, 2022

Comments

  • Atul Kakrana
    Atul Kakrana over 2 years

    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?

  • Atul Kakrana
    Atul Kakrana almost 12 years
    Thanks for your reply and code. The problem I am facing now is that my code is giving error 'Undefined variables' for variables defined in above code. This is because, earlier their values were explicitly mentioned inside the script but after including the code by Mark, the values are not recognized by script. In short how do I make script take values of variables from 'argparse' module. For ex. earlier in script: hostname = 127.0.0.1, username = xyz and password = abc but now these were replaced by code above (by Mark) therefore script now says 'Undefined Variables'.
  • Atcold
    Atcold almost 8 years
    You accepted your own problem solution, whereas @Mark did provide you an answer to your question. I'm not sure if this is very kind...