Calling Python from bash

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

Internal

Overview

This article summarizes a series of aspects related to invoking Python program from bash.

Running a Python Program with a Bash Wrapper

Check out these links for the meaning of standalone Python program and Python script.

An example of a run script for a simple Python project is available here:

Python Project Layout | The run script


Refactor all this and reconcile with

Python Project Layout


Problems to be solved:

1. The problem of Python binaries. We either rely on the correct version of the Python to be present on the executing image, or we encase it it in a virtual environment. There we need to be aware of the problem of the symbolic links and binary formats.

2. The problem of package dependencies and requirements.txt

3. The layout of the source code: sources and tests, or package dependencies in a Python package repository.

Python Source Code and Tests Maintained within the Project Structure

.
├─ .gitignore # Optional
├─ src
├─ tests
├─ venv
├─ requirements.txt
└─ <wrapper-bash-script>

To maintain this subtree as part of a larger Python project whose .gitignore ignores virtual environment directories, add this to the subtree's .gitignore:

!venv

TODO: reconcile with Python Project Layout.

Only Externally Published Packages

TODO

.
├─ venv
├─ requirements.txt
└─ <wrapper-bash-script>

Using the Interpreter from the a Virtual Environment

TODO

If you want to use the interpreter from a specific virtual environment instead of the interpreter found in PATH, explicitly use the path to the binary from the virtual environment directory:

$(dirname $0)/venv/bin/python ...

Bash Wrapper that Bootstraps a Virtual Environment

function init_venv() {
  [[ -d $(dirname $)/venv ]] && return 0
  info "initializing venv ..."
  python3 --version 1>/dev/null 2>&1 || fail "python3 not in PATH"
  python3 -m venv "$(dirname $)/venv"
}

Also see:

Python Virtual Environment

Inline Python Code

Use bash here-doc:

  python3 <<EOF
print('blah')
EOF

Also see:

Python Script

Bash to Python Function Mapping

Bash to Python Function Mapping