How to access python return value from bash script

I'm trying to understand how to access from a bash script the return value of a python script.

Clarifying through an example:

foo.py

def main():
    print ("exec main..")
    return "execution ok"

if __name__ == '__main__':
    main()

start.sh

script_output=$(python foo.py 2>&1)
echo $script_output

If I run the bash script, this prints the message "exec main..".

How can I store in script_output the return value (execution ok)? If I direct execution ok to stdout, the script_output will capture all the stdout (so the 2 print statement).

Is there any way to implement this?

Thanks! Alessio

3 answers

  • answered 2018-01-16 11:10 Avinash Raj

    You can get the previous command's output status through $?. If the python script ran successfully without any stderr, it should return 0 as exit code else it would return 1 or any number other than 0.

    #!/bin/bash
    python foo.py 2>&1 /dev/null
    script_output=$?
    echo $script_output
    

  • answered 2018-01-16 11:10 Viktor Khilin

    Bash contains only return code in $?, so you can't use it to print the text from python's return. My solution is write in to the stderr in python script, next print only stderr in bash:

    import sys
    
    
    def main():
        print ("exec main..")
        sys.stderr.write('execution ok\n')
        return "execution ok"
    
    if __name__ == '__main__':
        main()
    

    Bash:

    #!/bin/bash
    
    script_output=$(python foo.py 1>/dev/null)
    echo $script_output
    

    Output:

    execution ok
    

  • answered 2018-01-16 11:10 Inian

    Add a proper exit code from your script using the sys.exit() module. Usually commands return 0 on successful completion of a script.

    import sys
    
    def main():
        print ("exec main..")
        sys.exit(0)
    

    and capture it in shell script with a simple conditional. Though the exit code is 0 by default and need not be passed explicitly, using sys.exit() gives control to return non-zero codes on error cases wherever applicable to understand some inconsistencies with the script.

    if python foo.py 2>&1 >/dev/null; then
        echo 'script ran fine'
    fi