Skip to main content

>execute bash commands from python easily

Project description

PyBash

GitHub Workflow Status (with branch) PyPI - Downloads PyPI GitHub

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pybash-0.3.5.tar.gz (7.4 kB view details)

Uploaded Source

Built Distribution

pybash-0.3.5-py3-none-any.whl (8.3 kB view details)

Uploaded Python 3

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

Hashes for pybash-0.3.5.tar.gz
Algorithm Hash digest
SHA256 ec50344d9a0382ecd3f5fab23b06158a5629b4f3e6ae4b2f806582532da18464
MD5 174af7b8ccb7ce0b6c1df2901050e7d7
BLAKE2b-256 65014f671d14b06de2925b1159bee98a76373b08ba5cba98d6b49718110b0053

See more details on using hashes here.

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

Hashes for pybash-0.3.5-py3-none-any.whl
Algorithm Hash digest
SHA256 d147393a72bc5a3f43548ab9fa960043c6b270b97848f16d5ede785a236395ab
MD5 f4459fa4d3e1f7e8f3f69b0a89ed7c86
BLAKE2b-256 20d0fb39527a37aa3409469b063dc4a27e5d648c9e034337e44e0613dd8eb0b3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page