Calling Python from bash: Difference between revisions
(28 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
=Internal= | =Internal= | ||
* [[Bash#Subjects|bash]] | |||
* [[Python_Language_Modularization#Python_Script|Python Modularization | Python Script]] | * [[Python_Language_Modularization#Python_Script|Python Modularization | Python Script]] | ||
* [[ | * [[Python_Virtual_Environment#Overview|Python Virtual Environment]] | ||
=Overview= | =Overview= | ||
This article summarizes a series of aspects related to invoking Python program from bash. | 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 [[Python_Language_Modularization#Standalone_Program|standalone Python program]] and [[Python_Language_Modularization#Python_Script|Python script]]. | ||
An example of a <code>run</code> script for a simple Python project is available here: | |||
{{Internal|Python_Project_Layout#Add_the_run_script|Python Project Layout | The <tt>run</tt> script}} | |||
<font color=darkkhaki> | |||
Refactor all this and reconcile with: {{Internal|Python_Project_Layout#Overview|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. | |||
</font> | |||
==Python Source Code and Tests Maintained within the Project Structure== | |||
<font size=-1> | |||
. | |||
├─ .gitignore <font color=darkgray><i># Optional</I></font> | |||
├─ src | |||
├─ tests | |||
├─ venv | |||
├─ requirements.txt | |||
└─ <wrapper-bash-script> | |||
</font> | |||
To maintain this subtree as part of a larger Python project whose <code>.gitignore</code> ignores virtual environment directories, add this to the subtree's <code>.gitignore</code>: | |||
<syntaxhighlight lang='text'> | |||
!venv | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<font color=darkkhaki>TODO: reconcile with [[Python Project Layout]]</font>. | |||
==Only Externally Published Packages== | |||
<font color=darkkhaki>TODO</font> | |||
<font size=-1> | |||
. | |||
├─ venv | |||
├─ requirements.txt | |||
└─ <wrapper-bash-script> | |||
</font> | |||
=Using the Interpreter from the a Virtual Environment= | ==Using the Interpreter from the a Virtual Environment== | ||
<font color=darkkhaki> | <font color=darkkhaki> | ||
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: | 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: | ||
<syntaxhighlight lang='bash'> | <syntaxhighlight lang='bash'> | ||
Line 23: | Line 68: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
</font> | </font> | ||
===Bash Wrapper that Bootstraps a Virtual Environment=== | |||
<syntaxhighlight lang='bash'> | |||
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" | |||
} | |||
</syntaxhighlight> | |||
Also see: {{Internal|Python_Virtual_Environment#Overview|Python Virtual Environment}} | |||
= | =Inline Python Code= | ||
Use bash [[Bash_Input/Output#Here-Docs|here-doc]]: | |||
<syntaxhighlight lang='bash'> | |||
python3 <<EOF | |||
print('blah') | |||
EOF | |||
</syntaxhighlight> | |||
Also see: {{Internal|Python_Language_Modularization#Python_Script|Python Script}} | |||
=Bash to Python Function Mapping= | =Bash to Python Function Mapping= | ||
{{Internal|Bash to Python Function Mapping#Overview|Bash to Python Function Mapping}} | {{Internal|Bash to Python Function Mapping#Overview|Bash to Python Function Mapping}} |
Latest revision as of 21:10, 18 May 2023
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:
Refactor all this and reconcile with:
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:
Inline Python Code
Use bash here-doc:
python3 <<EOF
print('blah')
EOF
Also see: