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_shellaround with a syntax sugar.await $"command"returns anasyncio.subprocess.Processinstance; 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
shxdoes 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 -xin bash.capture(Default:False): If set to True, capture stdout and stderr instead of displaying them. The captured strings will replace the.stdoutand.stderrattributes of theasyncio.subprocess.Processinstance returned.await $("...", capture='o')andawait $("...", capture='e')are the aliases of(await $("...", capture=True)).stdoutand(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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
|