For writing async script with Python
Project description
shx
Inspired by zx
#!/usr/bin/env shx
await $"cat setup.py | grep name"
branch = await $("git branch --show-current", capture='o')
await $f"dep deploy --branch={branch}"
await gather(
$"sleep 1; echo 1",
$"sleep 2; echo 2",
$"sleep 3; echo 3",
)
name = "foo bar"
await $f"mkdir /tmp/{Q(name)}"
(Take a look at more examples.)
shx
makes your script writing experience better by taking the advantages of Python's sugary syntax, AsyncIO, and the extensive Python ecosystem. shx
does three things:
- Wrap
asyncio.create_subprocess_shell
around with a syntax sugar.await $"command"
returns anasyncio.subprocess.Process
instance; on non-zero return code, raisesubprocess.CalledProcessError
. - Provide a top-level async environment.
- Preload commonly used imports and utilities. Currently, the imports are:
import asyncio
from asyncio import *
from pathlib import Path
from shlex import quote as Q
import shutil
Note that
shx
does not perform quote escape automatically. Use functionQ
(alias ofshlex.quote
) to escape unsafe arguments.
Install
pip install shx
Settings and utility functions
Settings can either be task local (e.g. __.trace = True
) or per-command (e.g. await $("echo 42", trace=True)
):
shell
(Default:$(which bash)
): Shell to be used.prefix
(Default:set -euo pipefail;
): String to be prepended to a command.trace
(Default:True
): Display command if set to True. Same asset -x
in bash.capture
(Default:False
): If set to True, capture stdout and stderr instead of displaying them. The captured strings will replace the.stdout
and.stderr
attributes of theasyncio.subprocess.Process
instance returned.await $("...", capture='o')
andawait $("...", capture='e')
are the aliases of(await $("...", capture=True)).stdout
and(await $("...", capture=True)).stderr
, respectively.
Attributes:
__.argv
: alias ofsys.argv
, a list of command line arguments__.env
: alias ofos.environ
, a dict of environment variables
cd(cwd: str)
Change working directory to cwd
. Same as the task local settings, the changes are only effective within the current task.
question(prompt: str)
input()
with KeyboardInterrupt
handling.
About the subprocess syntax
No magic, no meta-programming, and no hacking, whatsoever. Prior execution, the script is tokenized, and the following replacements occur:
- "str prefix"
$"command"
->SHX("command")
- "function"
$("command", k1=v1, ...)
->SHX("command", k1=v1, ...)
where SHX
is an async function wrapping around asyncio.create_subprocess_shell
.
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
Built Distribution
File details
Details for the file shx-0.4.2.tar.gz
.
File metadata
- Download URL: shx-0.4.2.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bf7894d36d43fb07d550239c3364b4faf3e5d6a47f2c6e56891d53c1ce9c23a8 |
|
MD5 | 497486de22cbd1efb409698e70dfd374 |
|
BLAKE2b-256 | 968ad886c8b0469a954f59adf5b184dbae520d3c01e77427914c0ae7dcb5d476 |
File details
Details for the file shx-0.4.2-py3-none-any.whl
.
File metadata
- Download URL: shx-0.4.2-py3-none-any.whl
- Upload date:
- Size: 6.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 69f2424b77069edf23873ecce88af47bff1e1ad78595cc4e3301290c9497edd4 |
|
MD5 | d0c38f6cfbf3532794d151284a16e20f |
|
BLAKE2b-256 | 9762078cc58b4fcac34cb234ad856900d26664eda810b7d84cf99fc3366f66ea |