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

后端 未结 5 737
感情败类
感情败类 2021-01-02 16:27

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

相关标签:
5条回答
  • 2021-01-02 16:39

    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
    
    0 讨论(0)
  • 2021-01-02 16:52

    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

    0 讨论(0)
  • 2021-01-02 16:57

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

    0 讨论(0)
  • 2021-01-02 16:57

    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]
    
    0 讨论(0)
  • 2021-01-02 17:02

    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
    
    0 讨论(0)
提交回复
热议问题