Passing python array to bash script (and passing bash variable to python function)

11,496

Solution 1

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

Solution 2

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).

Share:
11,496
Homunculus Reticulli
Author by

Homunculus Reticulli

Updated on June 23, 2022

Comments

  • Homunculus Reticulli
    Homunculus Reticulli over 1 year

    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 in a bash script, so I may iterate over the array elements.

    For example:

    Python module (mymod)

    def foo():
        return ('String', 'Tuple', 'From', 'Python' )
    
    def foo1(numargs):
        return [x for x in range(numargs)]
    

    Bash script

    foo_array  = .... # obtain array from mymod.foo()
    for i in "${foo_array[@]}"
    do
        echo $i
    done
    
    
    foo1_array = .... # obtain array from mymod.foo1(pass arg count from bash)
    for j in "${foo1_array[@]}"
    do
        echo $j
    done
    

    How can I implement this in bash?.

    version Info:

    Python 2.6.5 bash: 4.1.5