I have written a Python module which contains functions that return arrays. I want to be able to access the string arrays returned from the python module, and iterate over i
In lieu of something like object serialization, perhaps one way is to print a list of comma separated values and pipe them from the command line.
Then you can do something like:
> python script.py | sh shellscript.sh
This helps too. script.py:
a = ['String','Tuple','From','Python']
for i in range(len(a)):
print(a[i])
and then we make the following bash script pyth.sh
#!/bin/bash
python script.py > tempfile.txt
readarray a < tempfile.txt
rm tempfile.txt
for j in "${a[@]}"
do
echo $j
done
sh pyth.sh
In addition, you can tell python process to read STDIN with "-" as in
echo "print 'test'" | python -
Now you can define multiline snippets of python code and pass them into subshell
FOO=$( python - <<PYTHON
def foo():
return ('String', 'Tuple', 'From', 'Python')
print ' '.join(foo())
PYTHON
)
for x in $FOO
do
echo "$x"
done
You can also use env and set to list/pass environment and local variables from bash to python (into ".." strings).
As well as Maria's method to obtain output from python, you can use the argparse
library to input variables to python scripts from bash; there are tutorials and further docs here for python 3 and here for python 2.
An example python script command_line.py
:
import argparse
import numpy as np
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('x', type=int)
parser.add_argument('array')
args = parser.parse_args()
print(type(args.x))
print(type(args.array))
print(2 * args.x)
str_array = args.array.split(',')
print(args.x * np.array(str_array, dtype=int))
Then, from a terminal:
$ python3 command_line.py 2 0,1,2,3,4
# Output
<class 'int'>
<class 'str'>
4
[0 2 4 6 8]
Second try - this time shell takes the integration brunt.
Given foo.py containing this:
def foo():
foo = ('String', 'Tuple', 'From', 'Python' )
return foo
Then write your bash script as follows:
#!/bin/bash
FOO=`python -c 'from foo import *; print " ".join(foo())'`
for x in $FOO:
do
echo "This is foo.sh: $x"
done
The remainder is first answer that drives integration from the Python end.
Python
import os
import subprocess
foo = ('String', 'Tuple', 'From', 'Python' )
os.putenv('FOO', ' '.join(foo))
subprocess.call('./foo.sh')
bash
#!/bin/bash
for x in $FOO
do
echo "This is foo.sh: $x"
done