Delegator is a Python library that allows you to define and execute shell commands in a more readable and maintainable way. It is a wrapper around the subprocess
module and provides a more high-level interface for running shell commands.
Delegator addresses one of Python's most notoriously difficult APIs: the subprocess module. By providing a human-friendly interface to shell command execution, it follows Kenneth's pattern of making complex system interactions accessible to everyday programmers.
Key Features
- Simplified API: Delegator abstracts away the complexity of the
subprocess
module and provides a more user-friendly API for executing shell commands. - Command Chaining: You can chain multiple commands together using the
|
operator, similar to how you would in a shell script. - Output Handling: Delegator provides methods for capturing and processing the output of shell commands, making it easy to work with the results.
- Error Handling: You can easily handle errors and exceptions that occur during command execution, allowing you to build robust shell scripts.
- Cross-Platform: Delegator works on all major platforms, including Windows, macOS, and Linux, making it a versatile tool for shell scripting.
Installation
You can install Delegator using uv
or pip
:
$ uv pip install delegator.py
Usage
Here's a simple example of how you can use Delegator to run a shell command:
import delegator
c = delegator.run('ls -l')
print(c.out)
In this example, we use the run
function to execute the ls -l
command and print the output to the console.
Command Chaining
Delegator allows you to chain multiple commands together using the |
operator. Here's an example:
import delegator
c = delegator.chain('ls -l | grep .py')
print(c.out)
In this example, we use the chain
function to run the ls -l | grep .py
command, which lists all Python files in the current directory.
Predecessor — Envoy
envoy
is a similar library that provides a high-level interface for subprocess management in Python. Delegator is a more modern and feature-rich alternative to Envoy, with additional functionality and improved performance. It has also been battle–tested in production environments and is used by pipenv for shell command execution.
The evolution from Envoy to Delegator demonstrates Kenneth's iterative approach to library design. Rather than abandoning concepts that didn't quite work, he refined them in subsequent projects, each time getting closer to the ideal developer experience.
Read More
The project was gifted to Amit Tripathi and is available on GitHub:
The practice of "gifting" projects to new maintainers reflects Kenneth's approach to sustainable open source development. Rather than letting projects stagnate, he ensures they find dedicated maintainers who can give them the attention they deserve.