zxpy
Shell scripts made simple 🐚
Inspired by Google's zx, but made much simpler and more accessible using Python.
Rationale
Bash is cool, and it's extremely powerful when paired with linux coreutils and pipes. But apart from that, it's a whole another language to learn, and has a (comparatively) unintuitive syntax for things like conditionals and loops.
zxpy aims to supercharge bash by allowing you to write scripts in Python, but with native support for bash commands and pipes:
#! /usr/bin/env zxpy
todo_comments = ~"git grep -n TODO"
for todo in todo_comments.splitlines():
filename, lineno, code = todo.split(':', 2)
*_, comment = code.partition('TODO')
print(f"{filename:<40} on line {lineno:<4}: {comment.lstrip(': ')}")
Running this, we get:
$ ./todo_check.py
README.md on line 154 : move this content somewhere more sensible.
instachat/lib/models/message.dart on line 7 : rename to uuid
instachat/lib/models/update.dart on line 13 : make int
instachat/lib/services/chat_service.dart on line 211 : error handling
server/api/api.go on line 94 : move these to /chat/@:address
server/api/user.go on line 80 : check for errors instead of relying on zero value
Installation 
pip install zxpy
Example
Make a file script.py (The name and extension can be anything):
#! /usr/bin/env zxpy
~'echo Hello world!'
file_count = ~'ls -1 | wc -l'
print("file count is:", file_count)
And then run it:
$ chmod +x ./script.py
$ ./script.py
Hello world!
file count is: 3
Run
>>> help('zxpy')in Python REPL to find out more ways to use zxpy.
A more involved example: run_all_tests.py
#! /usr/bin/env zxpy
test_files = ~"find -name '*_test\.py'"
for filename in test_files.splitlines():
try:
print(f'Running {filename:.<50}', end='')
output = ~f'python {filename}' # variables in your shell commands :D
assert output == ''
print('Test passed!')
except:
print(f'Test failed.')
Output:
$ ./run_all_tests.py
Running ./tests/python_version_test.py....................Test failed.
Running ./tests/platform_test.py..........................Test passed!
Running ./tests/imports_test.py...........................Test passed!
Examples are all in the examples folder.
Interactive mode
$ zxpy
zxpy shell
Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0]
>>> ~"ls | grep '\.py'"
__main__.py
setup.py
zx.py
>>>
Also works with
path/to/python -m zx
It can also be used to start a zxpy session in an already running REPL. Simply do:
>>> import zx; zx.start()
and zxpy should be enabled in the existing session.
Release files for zxpy 1.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zxpy-1.1.1.tar.gz | 5.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zxpy-1.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 11.1 kB
Release files / zxpy-1.1.1.tar.gz
| Download URL | zxpy-1.1.1.tar.gz |
|---|---|
| Size | 5.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ca1456b5c04e44c86e190a9a519ea949625ad612ba7eecd477643a06b0945c20
|
|
BLAKE2b-256 checksum How to use checksums |
239472747ecbf2df2bf8bf7fc3dd1e447f67b6dd1f585aa27ff1082bd2818e73
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.3.0 pkginfo/1.7.0 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.58.0 CPython/3.9.5
|
Release files / zxpy-1.1.1-py3-none-any.whl
| Download URL | zxpy-1.1.1-py3-none-any.whl |
|---|---|
| Size | 5.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
54e2cf823ffab6ae25bf7fe72bd02545c7636ef1ed2456a59e7ab9ce2c5e1aea
|
|
BLAKE2b-256 checksum How to use checksums |
354739e1799156d00f408bf4a8e0a10f1de66c95275e27e40d1134c29fb40a4e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.3.0 pkginfo/1.7.0 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.58.0 CPython/3.9.5
|