Pysh is a library for running external commands from a Python program, with the usual concision and clarity that Python achieves in other domains.
Usage
Simple commands are simple:
from pysh import check_cmd, try_cmd
check_cmd('gpg --decrypt --output {} {}', cleartext_path, cryptotext_path)
if not try_cmd('git diff-index --quiet HEAD'):
raise RuntimeError("worktree not clean")
repo_root = slurp_cmd('git rev-parse --show-toplevel')
# "slurp" strips trailing newlines, just like shell `$(...)`
Writing command lines
Command lines offer a format-like minilanguage, powered by
pysh.shwords. The format string is automatically split to form the
command's list of arguments, providing shell-script-like
convenience... but the interpolated data never affects the split,
avoiding classic shell-script bugs.
from pysh import shwords, check_cmd
shwords('rm -rf {tmpdir}/{userdoc}', tmpdir='/tmp', userdoc='1 .. 2')
# -> ['rm', '-rf', '/tmp/1 .. 2']
check_cmd('rm -rf {tmpdir}/{userdoc}', tmpdir='/tmp', userdoc='1 .. 2')
# removes `/tmp/1 .. 2` -- not `/tmp/1`, `..`, and `2`
A format-minilanguage extension {...!@} substitutes in a whole list:
check_cmd('grep -C2 TODO -- {!@}', files)
Each function taking a command line also has a twin, named with _f,
that opts into f-string-like behavior:
from pysh import check_cmd, check_cmd_f
check_cmd_f('{compiler} {cflags!@} -c {source_file} -o {object_file}')
# equivalent to:
check_cmd('{} {!@} -c {} -o {}',
compiler, cflags, source_file, object_file)
Pipelines
Pipelines are composed with the | operator. Each stage (or
"filter") in the pipeline can be an external command, or Python code.
Most often pipelines are built from the filters offered in the
pysh.cmd module. You can consume the output with pysh.slurp:
import pysh
from pysh import cmd
hello = pysh.slurp(cmd.echo(b'hello world')
| cmd.run('tr h H'))
# -> b'Hello world'
Or iterate through it:
for commit_id in (cmd.run('git rev-list -n10 -- {!@}', files)
| cmd.splitlines()):
# ... gets last 10 commits touching `files`
You can also write filters directly, using the @pysh.filter
decorator. See examples in the example/ tree. This is also the same
API that all the filters in pysh.cmd are built on, so there are many
examples there.
Metadata
Release files for pysh-lib 0.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pysh-lib-0.0.2.tar.gz | 14.5 kB | Without provenance | Details for pysh-lib-0.0.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pysh_lib-0.0.2-py3-none-any.whl | Python 3 | none | any | Details for pysh_lib-0.0.2-py3-none-any.whl |
Total release size: 26.4 kB
Release files / pysh-lib-0.0.2.tar.gz
| Download URL | pysh-lib-0.0.2.tar.gz |
|---|---|
| Size | 14.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
16d4eaa77cbb79f2e999e0a9433a1d7e13718513442757271cdcc8cac82d081a
|
|
BLAKE2b-256 checksum How to use checksums |
0a13a82ba5a748cbbb4a27badb40b0049924e2dd6d182d7c87d54f1ff82780f5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.3
|
Release files / pysh_lib-0.0.2-py3-none-any.whl
| Download URL | pysh_lib-0.0.2-py3-none-any.whl |
|---|---|
| Size | 11.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
92f5b28be5e597ec927c2bddd290455b03f01207f13c01c44745ed2708e84d26
|
|
BLAKE2b-256 checksum How to use checksums |
23e37964e8909972b405fcba873f6e9ff2faef0fd781dfaa9422ed430e7ef652
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.3
|
Security for pysh-lib 0.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.