Skip to main content
Help the Python Software Foundation raise $60,000 USD by December 31st!  Building the PSF Q4 Fundraiser

Basic infrastructure for writing scripts

Project description

Build Status PyPI version

Python is an excellent language that makes writing scripts very straightforward. Over the course of writing many scripts, we realized that we were doing some things over and over like creating a logger and accepting command line arguments. Base script is a very simple abstraction that takes care of setting up logging and other basics so you can focus on your application specific logic.

Here are some facilities that Base Script offers: - Logging - Accepting command-line arguments using argparse


pip install basescript


Here is a simple example to get started

Hello World

from basescript import BaseScript

class HelloWorld(BaseScript):
    def run(self):
        print "Hello world"

if __name__ == '__main__':

NOTE: all examples showcased here are available under the
``examples`` directory

Run the above by doing:

python run

Run script with log level set to DEBUG

python --log-level DEBUG run

Run script with custom log file

python --log-level DEBUG --log mylog run

Command line args, Using the logger

The following is a more involved example

from basescript import BaseScript

class Adder(BaseScript):
    # The following specifies the script description so that it be used
    # as a part of the usage doc when --help option is used during running.
    DESC = 'Adds numbers'

    def __init__(self):
        super(Adder, self).__init__()
        self.a = 10
        self.b = 20

    def define_args(self, parser):
        parser.add_argument('c', type=int, help='Number to add')

    def run(self):"Starting run of script ...")

        print self.a + self.b + self.args.c"Script is done")

if __name__ == '__main__':

Run the script as follows and observe the usage information shown. Note how the description appears along with the c argument.

python --help
usage: [-h] [--name NAME] [--log-level LOG_LEVEL]
                [--log-format {json,pretty}] [--log-file LOG_FILE] [--quiet]
                [--metric-grouping-interval METRIC_GROUPING_INTERVAL]
                {run} ...

Adds numbers

optional arguments:
  -h, --help            show this help message and exit
  --name NAME           Name to identify this instance
  --log-level LOG_LEVEL
                        Logging level as picked from the logging module
  --log-format {json,pretty}
                        Force the format of the logs. By default, if the
                        command is from a terminal, print colorful logs.
                        Otherwise print json.
  --log-file LOG_FILE   Writes logs to log file if specified, default: None
  --quiet               if true, does not print logs to stderr, default: False
  --metric-grouping-interval METRIC_GROUPING_INTERVAL
                        To group metrics based on time interval ex:10 i.e;(10
  --debug               To run the code in debug mode

python run --help
usage: run [-h] c

positional arguments:
  c           Number to add

optional arguments:
  -h, --help  show this help message and exit

Run the script now to see the intended output

python run 30

Run the same with info and higher level logs enabled

python --log-level INFO 30
2016-04-10 13:48:27,356 INFO Starting run of script ...
2016-04-10 13:48:27,356 INFO Script is done

--log-level accepts all the values shown at

log is a log object created using python’s standard logging module. You can read more about it at


When writing a Metric using self.log, you can specify type=metric. If this is done, a background thread will automatically group multiple metrics into one by averaging values (to prevent writing too many log lines).

from basescript import BaseScript
import time
import random

class Stats(BaseScript):
    def __init__(self):
        super(Stats, self).__init__()

    def run(self):
        ts = time.time()
        while True:
            # Metric Format.
  "stats", time_duration=(time.time()-ts), type="metric", random_number=random.randint(1, 50))

if __name__ == '__main__':

Run the command to see the output.

python --metric-grouping-interval 5 run

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for basescript, version 0.2.4
Filename, size File type Python version Upload date Hashes
Filename, size basescript-0.2.4-py2-none-any.whl (12.7 kB) File type Wheel Python version py2 Upload date Hashes View
Filename, size basescript-0.2.4.tar.gz (11.0 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page