python cli scripts for humans
Project description
Captain
Easy python cli scripts for people that just want get things done.
Important - If you have older scripts you might need the captain~=3.0.0 branch. The mainline branch has an entirely different interface.
Usage
A valid captain
cli script needs just two things:
-
A
Default
class that extendscaptain.Command
and has ahandle()
method:from captain import Command class Default(Command): def handle(self, foo, bar): return 0
-
Calling
captain.handle()
at the end of your script:from captain import Command, handle class Default(Command): def handle(self, foo, bar): return 0 if __name__ == "__main__": handle()
That's it! Whatever arguments you define in your class's Default.handle()
method will be options on the command line. A captain script is called just like any other python command line script, so to run the above example you could do:
$ python path/to/script.py --foo=1 --bar=2
Argument Decorator
The captain.arg()
decorator provides a nice passthrough api to the full argparse.ArgumentParser.add_argument() method if you want to fine tune how arguments are passed into your script:
from captain import Command, handle, arg
class Default(Command):
@arg('--foo', '-f', action="store_true")
@arg('arg', metavar='ARG')
def handle(self, *args, **kwargs):
'''this is the help description'''
self.output.out(args)
self.output.out(kwargs)
if __name__ == "__main__":
handle()
Would print a help string like this:
usage: script.py [-h] [--foo FOO] ARG
this is the help description
positional arguments:
ARG
optional arguments:
-h, --help show this help message and exit
--foo FOO, -f FOO
Command Output
The captain.io.Output
class makes it easy to print stuff in your script while still giving you full control by being able to configure the logger if you need to. It also will obey the global --quiet
flag that Captain adds to every script.
It's available in the handle()
method by using self.output
:
from captain import Command
class Default(Command):
def handle(self, *args, **kwargs):
var1 = "print"
var2 = "stdout"
self.output.out("this will {} to {}", var1, var2)
var2 = "stderr"
self.output.err("this will {} to {}", var1, var2)
e = ValueError("this will print with stacktrace and everything")
self.output.exception(e)
The captain.io.Output
class has a lot of nice little helper methods but Captain can also work with modules like clint if you need to do more advanced cli output.
Examples
A typical standard python cli script
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='fancy script description')
parser.add_argument("--foo", action='store_true')
parser.add_argument("--bar", default=0, type=int)
parser.add_argument("args", nargs='*')
args = parser.parse_args()
sys.exit(0)
would become:
import captain
class Default(captain.Command):
def handle(foo=False, bar=0, *args):
'''fancy script description'''
return 0
if __name__ == '__main__':
captain.handle()
Subcommands
Captain supports multiple subcommands defined in the script by naming your captain.Command
child classes something other than Default
:
# cli.py
import captain
class Foo(captain.Command):
def handle(self):
pass
class Bar(captain.Command):
def handle(self):
pass
if __name__ == '__main__':
captain.handle()
So foo
could be called using:
$ python cli.py foo
And bar
could be called using:
$ python cli.py bar
Embedding captain in another package
If you want a script from you package to be usable using both python -m example
and maybe a console_scripts
entry point defined in setup.py
, you can set up your package's __main__.py
module like this:
# example/__main__.py
from captain import Command, handle
class Default(captain.Command):
def handle(self):
pass
if __name__ == "__main__":
handle()
And then in your setup.py
script you can add:
entry_points = {
'console_scripts': [
'example = example.__main__:handle'
],
}
That's all there is to it.
Install
Use pip:
$ pip install captain
For latest and greatest:
$ pip install -U "git+https://github.com/Jaymon/captain#egg=captain"
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file captain-4.0.2.tar.gz
.
File metadata
- Download URL: captain-4.0.2.tar.gz
- Upload date:
- Size: 21.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.18.4 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.38.0 CPython/2.7.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 197bce0dd5f3a973ccc35309c5b09af43204aaaed9226f860fa8ab5bfea125e4 |
|
MD5 | e3bcb6cd6cea94f7344020445ac2ed04 |
|
BLAKE2b-256 | 8ac7e04fe0b37e0f213eef6f2055d1d0fcb32d091e1b8b591096981ab5f2a95c |