Call Python script from bash with argument

245,588

Solution 1

To execute a python script in a bash script you need to call the same command that you would within a terminal. For instance

> python python_script.py var1 var2

To access these variables within python you will need

import sys
print(sys.argv[0]) # prints python_script.py
print(sys.argv[1]) # prints var1
print(sys.argv[2]) # prints var2

Solution 2

Beside sys.argv, also take a look at the argparse module, which helps define options and arguments for scripts.

The argparse module makes it easy to write user-friendly command-line interfaces.

Solution 3

Use

python python_script.py filename

and in your Python script

import sys
print sys.argv[1]

Solution 4

Embedded option:

Wrap python code in a bash function.

#!/bin/bash

function current_datetime {
python - <<END
import datetime
print datetime.datetime.now()
END
}

# Call it
current_datetime

# Call it and capture the output
DT=$(current_datetime)
echo Current date and time: $DT

Use environment variables, to pass data into to your embedded python script.

#!/bin/bash

function line {
PYTHON_ARG="$1" python - <<END
import os
line_len = int(os.environ['PYTHON_ARG'])
print '-' * line_len
END
}

# Do it one way
line 80

# Do it another way
echo $(line 80)

http://bhfsteve.blogspot.se/2014/07/embedding-python-in-bash-scripts.html

Solution 5

I have a bash script that calls a small python routine to display a message window. As I need to use killall to stop the python script I can't use the above method as it would then mean running killall python which could take out other python programmes so I use

pythonprog.py "$argument" & # The & returns control straight to the bash script so must be outside the backticks. The preview of this message is showing it without "`" either side of the command for some reason.

As long as the python script will run from the cli by name rather than python pythonprog.py this works within the script. If you need more than one argument just use a space between each one within the quotes.

Share:
245,588
Jimmy
Author by

Jimmy

Updated on November 19, 2020

Comments

  • Jimmy
    Jimmy over 3 years

    I know that I can run a python script from my bash script using the following:

    python python_script.py
    

    But what about if I wanted to pass a variable / argument to my python script from my bash script. How can I do that?

    Basically bash will work out a filename and then python will upload it, but I need to send the filename from bash to python when I call it.

  • CodeGuru
    CodeGuru over 7 years
    possible to replace "string arg" with a variable that is from bash?
  • Mo Ali
    Mo Ali over 7 years
    I agree, to me argparse is a much better option than sys.argv
  • cate
    cate almost 7 years
    the getopt docs start: Note: The getopt module is a parser for command line options whose API is designed to be familiar to users of the C getopt() function. Users who are unfamiliar with the C getopt() function or who would like to write less code and get better help and error messages should consider using the argparse module instead.
  • burcak
    burcak almost 5 years
    Thanks. However this way restricts the python file for only one use case. Is there a way to call methods of a python file with dynamic parameters within bash scripts? In this way, we will be able to use the same python file. I tried to do this with calls python file methods with $var within bash script. But it somehow failed.
  • Thiru
    Thiru almost 5 years
    @burcak If you want to execute the python file parallelly based on the dynamic parameters, First construct the complete path <<python script location path>>/<<python script name>> param1 param2|<<python script location path>>/<<python script name>> param3 param4 in the bash script, then pass the output as an argument to the below python script, import sys import subprocess arg_str = " ".join(sys.argv[1:]) cmds = arg_str.split('|') for cmd in cmds: print('call -- ' + cmd) subprocess.Popen(cmd, shell=True) print('call cmds finished')
  • Saket Suraj
    Saket Suraj about 2 years
    Integer arguments are treated as string and not convertible with this method.
  • Patrick Ruff
    Patrick Ruff almost 2 years
    Was BASHING my head in looking for something like this. I think I had something similar but it was broken and this solved my issue (calling Bash, then Python, then back to Bash). THANK YOU!
  • yishairasowsky
    yishairasowsky almost 2 years
    Not sure why you exclude the tab for indent on the second line.