>execute bash commands from python easily
Project description
PyBash
Streamline bash-command execution from python with a new syntax. It combines the simplicity of writing bash scripts with the flexibility of python. Under the hood, any line or variable assignment starting with $
or surrounded by parentheses is transformed to python subprocess
calls and then injected into sys.meta_path
as an import hook. All possible thanks to the wonderful ideas project!
For security and performance reasons, PyBash will NOT execute as shell, unless explicitly specified with a >
instead of a single $
before the command. While running commands as shell can be convenient, it can also spawn security risks if you're not too careful. If you're curious about the transformations, look at the unit tests for some quick examples.
Note: this is a mainly experimental library.
Setup
As standalone transformer
pip install pybash
from pybash.transformer import transform
transform("$echo hello world") # returns the python code for the bash command as string
As script runner
pip install "pybash[script]"
Example
text = "HELLO WORLD"
$echo f{text}
Run script:
python -m pybash hello.py
Supported transforms
1. Simple execution with output
$python --version
$echo \\nthis is an echo
outputs:
Python 3.9.15
this is an echo
2. Set output to variable and parse
out = $cat test.txt
test_data = out.decode('utf-8').strip()
print(test_data.replace("HELLO", "HOWDY"))
outputs:
HOWDY WORLD
3. Wrapped, in-line execution and parsing
print(($cat test.txt).decode('utf-8').strip())
outputs:
HELLO WORLD
4. Redirection
$echo "hello" >> test4.txt
5. Pipe chaining
$cat test.txt | sed 's/HELLO/HOWDY/g' | sed 's/HOW/WHY/g' | sed 's/WHY/WHEN/g'
outputs:
WHENDY WORLD
6. Redirection chaining
$cat test.txt | sed 's/HELLO/HOWDY\\n/g' > test1.txt >> test2.txt > test3.txt
7. Chaining pipes and redirection- works in tandem!
$cat test.txt | sed 's/HELLO/HOWDY\\n/g' > test5.txt
8. Input redirection
$sort < test.txt >> sorted_test.txt
$sort < test.txt | sed 's/SORT/TEST\\n/g'
9. Glob patterns with shell
>ls .github/*
10. Direct interpolation
Denoted by {{code here}}. Interpolated as direct code replace. The value/output of the variable, function call, or the expression must not include spaces.
## GOOD
command = "status"
def get_option(command):
return "-s" if command == "status" else "-v"
$git {{command}} {{get_option(command)}}
display_type = "labels"
$kubectl get pods --show-{{display_type}}=true
## BAD
option = "-s -v"
$git status {{option}}
options = ['-s', '-v']
$git status {{" ".join(options)}}
# use dynamic interpolation
options = {'version': '-v'}
$git status {{options['version']}}
11. f-string interpolation
Denoted by f{ any python variable, function call, or expression here }. Interpolated as f-string. The output of the variable, function call, or the expression must still not include spaces.
## GOOD
# git -h
options = {'version': '-v', 'help': '-h'}
$git f{options['h']}
# kubectl get pods --show-labels -n coffee
namespace = "coffee"
$kubectl get pods f{"--" + "-".join(['show', 'labels'])} -n f{namespace}
## BAD
option = "-s -v"
$git status f{option}
Also works inside methods!
# PYBASH DEMO #
def cp_test():
$cp test.txt test_copy.txt
cp_test()
Dev
Demo
python -m pybash examples/hello.py
python -m pybash demo
Debug
make debug
to view the transformed source code
Project details
Release history Release notifications | RSS feed
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 pybash-0.3.5.tar.gz
.
File metadata
- Download URL: pybash-0.3.5.tar.gz
- Upload date:
- Size: 7.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.9.18
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ec50344d9a0382ecd3f5fab23b06158a5629b4f3e6ae4b2f806582532da18464 |
|
MD5 | 174af7b8ccb7ce0b6c1df2901050e7d7 |
|
BLAKE2b-256 | 65014f671d14b06de2925b1159bee98a76373b08ba5cba98d6b49718110b0053 |
File details
Details for the file pybash-0.3.5-py3-none-any.whl
.
File metadata
- Download URL: pybash-0.3.5-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.9.18
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d147393a72bc5a3f43548ab9fa960043c6b270b97848f16d5ede785a236395ab |
|
MD5 | f4459fa4d3e1f7e8f3f69b0a89ed7c86 |
|
BLAKE2b-256 | 20d0fb39527a37aa3409469b063dc4a27e5d648c9e034337e44e0613dd8eb0b3 |