Skip to main content

subb is a wrapper for python subprocess module

Project description

subb a nice wrapper for python's subprocess module

I am often using python as a scripting language, now shelling out to external programs is probably the most common thing done by a script. Python has the subprocess module for this task, which has a very general interface. I think it is not very well suitable for a quick script.

That's why I often find myself writing a wrapper object for the submodule process. Now the subb package is supposed to be a general wrapper that would cover most use cases.

install it

pip3 install subb

The interface

The subb.RunCommand class is exported, The RunCommand.run method runs one process, and waits for it to terminate. Upon completion of the run, you have the following members set: output - standart output, error standard error, status the status.exit_code is the status of the command.

The subb.RunCommand constructor is receiving options for each call to the run method.

See the test for example usages

Now some examples:

Basic test

This shows the standard output of the commands, now optional argument trace_on=subb.RunCommand.TRACE_WITH_TIMESTAMP means that the command and its output are printed to standard error, just like set -x in bash.

        cmd = subb.RunCommand(trace_on=subb.RunCommand.TRACE_WITH_TIMESTAMP)

        cmd.run("ls -al")

        print("Command standard output: ", cmd.output)

        cmd.run("openssl rand -hex 9")

        print("Command standard output: ", cmd.output)

        cmd.run("git ls-files")

Option exit_on_error means that if the status of a command is not zero, then call sys.exit, just like shell's set -e

        cmd = subb.RunCommand(trace_on=subb.RunCommand.TRACE_ON, exit_on_error = True)

        got_exit = False
        try:
            cmd.run("false")
        except SystemExit as ex:
            print("caught SystemExit from run('false')", str(ex))
            got_exit = True

        self.assertTrue(got_exit)

Option convert_to_text is by default on, the output is converted to text (utf-8) if it is set to None, then you get binary output

        cmd = subb.RunCommand(trace_on=subb.RunCommand.TRACE_ON, exit_on_error = True, convert_to_text = None)

        cmd.run("openssl rand 16")

        self.assertTrue( isinstance(cmd.output, bytes), "hex output expected")

The use_shell option is off by default, if you set it then the shell will be used to run the command

        cmd = subb.RunCommand(trace_on=subb.RunCommand.TRACE_ON, use_shell = True, exit_on_error = True)

        cmd.run("""find . -name "*.py" | grep -c subby.py""")

        print("shell output: ", cmd.output)

By default there is no timeout, but you can set one with the timeout_sec option

        cmd = subb.RunCommand(trace_on=subb.RunCommand.TRACE_WITH_TIMESTAMP, timeout_sec=7)

        got_timeout = False
        try:
            cmd.run("python3 stuck.py")
        except subprocess.TimeoutExpired as exc:
            print("got timeout exception: ", exc)
            got_timeout = True

        self.assertTrue(got_timeout)

Platform specific options held in either subb.PlatformOptionsPosix or subb.PlatformOptionsWindows (arguments to constructors are just like the platform options is subprocess.Popen, and passed via the platform_option option in RunCommand constructor.

        if sys.platform not in ("linux", "darwin"):
            return

        key = "secret secret"
        read_end, write_end = os.pipe()
        os.write(write_end, bytes(key, encoding='utf-8'))
        os.close(write_end)
        os.set_inheritable(read_end, True)

        print("parent read_fd: ", read_end)

        env = {**os.environ, "read_fd": str(read_end)}

        posix_opts = subb.PlatformOptionsPosix( pass_fds=(read_end,) )
        cmd = subb.RunCommand(trace_on=subb.RunCommand.TRACE_ON, platform_option=posix_opts, env=env)
        cmd.run("python3 read.py")

        print("posix test output: ", cmd.output)
        self.assertTrue(cmd.output == "message from parent: " + key + "\n")

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

subb-1.0.3.tar.gz (6.5 kB view details)

Uploaded Source

Built Distribution

subb-1.0.3-py3-none-any.whl (5.8 kB view details)

Uploaded Python 3

File details

Details for the file subb-1.0.3.tar.gz.

File metadata

  • Download URL: subb-1.0.3.tar.gz
  • Upload date:
  • Size: 6.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.6

File hashes

Hashes for subb-1.0.3.tar.gz
Algorithm Hash digest
SHA256 84e6172bf48ebbb6bfd4f3b5bdb5b60adcad9ec69ac7c7e8c07d5459f64984fe
MD5 eab9dcb49b32915ca42706cee460b0ba
BLAKE2b-256 40be88368283c3b1b4d3d595d9d78176d89c11f704e63e9b2eea5ad196dda56f

See more details on using hashes here.

File details

Details for the file subb-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: subb-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 5.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.6

File hashes

Hashes for subb-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 fbe946b12181c4a7dc2b0239d1dfb8c949ae21080cee920a216717d0892a3bec
MD5 0bb27a2793749c805a418134f429b29d
BLAKE2b-256 c5f13e34835c1b61c12954e137c66e8310999d760bf45d8f2ecb6b4aa90c2ac5

See more details on using hashes here.

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