failprint
Run a command, print its output only if it fails.
Tired of searching the quiet
options of your programs
to lighten up the output of your make check
or make lint
commands?
Tired of finding out that standard output and error are mixed up in some of them?
Simply run your command through failprint
.
If it succeeds, nothing is printed.
If it fails, standard error is printed.
Plus other configuration goodies :wink:
Example
You don't want to see output when the command succeeds.
The task runner duty
uses failprint
,
allowing you to define tasks in Python and run them with minimalist and beautiful output:
Requirements
failprint requires Python 3.8 or above.
To install Python 3.8, I recommend using pyenv
.
git clone https://github.com/pyenv/pyenv ~/.pyenv
export PATH="${HOME}/.pyenv/bin:${PATH}"
export PYENV_ROOT="${HOME}/.pyenv"
eval "$(pyenv init -)"
pyenv install 3.8.17
pyenv global system 3.8.17
Installation
pip install failprint
With uv
:
uv tool install failprint
Usage
% poetry run failprint -h
usage: failprint [-h] [-c {stdout,stderr,both,none}] [-f {pretty,tap}] [-y | -Y] [-p | -P] [-q | -Q] [-s | -S] [-z | -Z] [-n NUMBER]
[-t TITLE]
COMMAND [COMMAND ...]
positional arguments:
COMMAND
optional arguments:
-h, --help show this help message and exit
-c {stdout,stderr,both,none}, --capture {stdout,stderr,both,none}
Which output to capture. Colors are supported with 'both' only, unless the command has a 'force color'
option.
-f {pretty,tap}, --format {pretty,tap}
Output format. Pass your own Jinja2 template as a string with '-f custom=TEMPLATE'. Available variables:
command, title (command or title passed with -t), code (exit status), success (boolean), failure (boolean),
number (command number passed with -n), output (command output), nofail (boolean), quiet (boolean), silent
(boolean). Available filters: indent (textwrap.indent).
-y, --pty Enable the use of a pseudo-terminal. PTY doesn't allow programs to use standard input.
-Y, --no-pty Disable the use of a pseudo-terminal. PTY doesn't allow programs to use standard input.
-p, --progress Print progress while running a command.
-P, --no-progress Don't print progress while running a command.
-q, --quiet Don't print the command output, even if it failed.
-Q, --no-quiet Print the command output when it fails.
-s, --silent Don't print anything.
-S, --no-silent Print output as usual.
-z, --zero, --nofail Don't fail. Always return a success (0) exit code.
-Z, --no-zero, --strict
Return the original exit code.
-n NUMBER, --number NUMBER
Command number. Useful for the 'tap' format.
-t TITLE, --title TITLE
Command title. Default is the command itself.
from failprint.runners import run
cmd = "echo hello"
exit_code = run(
cmd,
args=None,
kwargs=None,
number=1,
capture=None,
title=None,
fmt=None,
pty=False,
progress=True,
nofail=False,
quiet=False,
silent=False,
)