Skip to main content

Register python functions as bash commands

Project description

pybashrc: Automatically register python functions as bash commands

This is a very simple utility that will create a ~/.pybashrc.py file, and the functions it contains will be made accessible as bash (or zsh) commands.

By default, pybashrc aliases all functions that do not start with an underscore and were created in ~/.pybashrc.py (i.e. they must not be imported). For example, this is the default template file:

# Pybashrc file. Create your command-line accessible python functions here.
def _hidden_print_function(*args):
    """This function will be ignored by pybashrc, and will not be available from the
    command line.
    However, other functions can still use it.
    """
    print(*args)


def test_pybashrc(first_argument: str, second_argument: str = "second_argument"):
    """Default test function that simply prints its input arguments. This only serves as
    an example of how to define pybashrc functions.
    Arguments:
        - first_argument (str): The first argument.
        - second_argument (str): The second argument, which has a default value.
    """
    _hidden_print_function("This is the pybash default test function.")
    _hidden_print_function(f"Provided arguments: {first_argument}, {second_argument}")

When running pybash, you'll see the available functions:

$ pybash
Available functions:
- test_pybashrc(first_argument: str, second_argument: str = 'second_argument')
	Default test function that simply prints its input arguments. This only serves as an example of how to define pybashrc functions.

	Arguments:
		- first_argument (str): The first argument.
		- second_argument (str): The second argument, which has a default value.

And you can now execute test_pybashrc directly from the command line:

$ test_pybashrc arg1 arg2
This is the pybash default test function.
Provided arguments: arg1, arg2

Installation

Simply run pip install pybashrc, and then run pybash-configure once to set up the bash/zsh alias files etc. After that, you're ready to go! Any time you update your .pybashrc.py, your shell functions will also be updated (note that you'll need to restart the shell for a new alias to become available). If you forget which functions are available or what their usage is, simply run pybash to get an overview.

Click functions

pybashrc also supports click functions:

import click

@click.command(
    help="A click command rather than a default python function."
    + " It has one argument with several options and a flag that can be toggled."
)
@click.argument(
    "first_arg",
    type=click.Choice(["option1", "option2", "option3"], case_sensitive=False),
)
@click.option(
    "-f",
    "--flag",
    is_flag=True,
    default=False,
    show_default=True,
    help="A command-line flag",
)
def click_function(first_arg, flag):
    print(f"Click function first arg: {first_arg}, flag: {flag}")
$ pybash
Available functions:
- click_function(first_arg, flag)
    Usage:  [OPTIONS] [option1|option2|option3]

      A click command rather than a default python function. It has one argument
      with several options and a flag that can be toggled.

    Options:
      -f, --flag  A command-line flag  [default: False]
      --help      Show this message and exit.

Exporting external functions

You may want to make a CLI function available that is not part of your .pybashrc.py file. For example, let's say you want to make re.sub command-line accessible. This can be done very easily by simply importing it, and then specifying it in __all__:

from re import sub

__all__ = ["sub"]

Whenever an __all__ is specified, pybashrc will alias those functions regardless of whether they were defined in your .pybashrc.py or imported from elsewhere. If you now run pybash to see the available commands:

$ pybash
Available functions:
- sub(pattern, repl, string, count=0, flags=0)
    Return the string obtained by replacing the leftmost
    non-overlapping occurrences of the pattern in string by the
    replacement repl.  repl can be either a string or a callable;
    if a string, backslash escapes in it are processed.  If it is
    a callable, it's passed the Match object and must return
    a replacement string to be used.

So you can now call sub <pattern> <replacement> <string> directly from the command line!

$ sub "\s" "_" "some test string"
some_test_string

Running from a different virtual environment

To run your pybash scripts from a different virtual environment, simply make sure that that environment has pybashrc installed and pybash-configure has been run from there once. Once that is done, pybashrc will simply execute your scripts with the currently active virtual environment!

Project details


Download files

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

Source Distribution

pybashrc-1.2.0.tar.gz (6.5 kB view hashes)

Uploaded Source

Built Distribution

pybashrc-1.2.0-py3-none-any.whl (7.8 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page