How to call a shell script from python code?

PythonShell

Python Problem Overview


How to call a shell script from python code?

Python Solutions


Solution 1 - Python

The subprocess module will help you out.

Blatantly trivial example:

>>> import subprocess
>>> subprocess.call(['sh', './test.sh']) # Thanks @Jim Dennis for suggesting the []
0 
>>> 

Where test.sh is a simple shell script and 0 is its return value for this run.

Solution 2 - Python

There are some ways using os.popen() (deprecated) or the whole subprocess module, but this approach

import os
os.system(command)

is one of the easiest.

Solution 3 - Python

In case you want to pass some parameters to your shell script, you can use the method shlex.split():

import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))

with test.sh in the same folder:

#!/bin/sh
echo $1
echo $2
exit 0

Outputs:

$ python test.py 
param1
param2

Solution 4 - Python

import os
import sys

Assuming test.sh is the shell script that you would want to execute

os.system("sh test.sh")

Solution 5 - Python

I'm running python 3.5 and subprocess.call(['./test.sh']) doesn't work for me.

I give you three solutions depends on what you wanna do with the output.

1 - call script. You will see output in your terminal. output is a number.

import subprocess 
output = subprocess.call(['test.sh'])

2 - call and dump execution and error into string. You don't see execution in your terminal unless you print(stdout). Shell=True as argument in Popen doesn't work for me.

import subprocess
from subprocess import Popen, PIPE

session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()

if stderr:
    raise Exception("Error "+str(stderr))

3 - call script and dump the echo commands of temp.txt in temp_file

import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
    output = file.read()
print(output)

Don't forget to take a look at the doc subprocess

Solution 6 - Python

Use the subprocess module as mentioned above.

I use it like this:

subprocess.call(["notepad"])

Solution 7 - Python

I know this is an old question but I stumbled upon this recently and it ended up misguiding me since the Subprocess API as changed since python 3.5.

The new way to execute external scripts is with the run function, which runs the command described by args. Waits for command to complete, then returns a CompletedProcess instance.

import subprocess

subprocess.run(['./test.sh'])

Solution 8 - Python

In case the script is having multiple arguments

#!/usr/bin/python

import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output

Output will give the status code. If script runs successfully it will give 0 otherwise non-zero integer.

podname=xyz  serial=1234
0

Below is the test.sh shell script.

#!/bin/bash

podname=$1
serial=$2
echo "podname=$podname  serial=$serial"

Solution 9 - Python

Subprocess module is a good module to launch subprocesses. You can use it to call shell commands as this:

subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)

You can see its documentation here.

If you have your script written in some .sh file or a long string, then you can use os.system module. It is fairly simple and easy to call:

import os
os.system("your command here")
# or
os.system('sh file.sh')

This command will run the script once, to completion, and block until it exits.

Solution 10 - Python

If your shell script file does not have execute permissions, do so in the following way.

import subprocess
subprocess.run(['/bin/bash', './test.sh'])

Solution 11 - Python

Subprocess is good but some people may like scriptine better. Scriptine has more high-level set of methods like shell.call(args), path.rename(new_name) and path.move(src,dst). Scriptine is based on subprocess and others.

Two drawbacks of scriptine:

  • Current documentation level would be more comprehensive even though it is sufficient.

  • Unlike subprocess, scriptine package is currently not installed by default.

Solution 12 - Python

Please Try the following codes :

Import Execute 

Execute("zbx_control.sh")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionUmesh KView Question on Stackoverflow
Solution 1 - PythonManoj GovindanView Answer on Stackoverflow
Solution 2 - PythonMichał NiklasView Answer on Stackoverflow
Solution 3 - PythonFranck DernoncourtView Answer on Stackoverflow
Solution 4 - PythonSrayan GuhathakurtaView Answer on Stackoverflow
Solution 5 - PythonlauralacarraView Answer on Stackoverflow
Solution 6 - Pythonhugo24View Answer on Stackoverflow
Solution 7 - PythonKévin Sanchez LacroixView Answer on Stackoverflow
Solution 8 - PythonRishi BansalView Answer on Stackoverflow
Solution 9 - PythonAnkit SinghView Answer on Stackoverflow
Solution 10 - PythonthomasXuView Answer on Stackoverflow
Solution 11 - PythonAkseli PalénView Answer on Stackoverflow
Solution 12 - PythonManasView Answer on Stackoverflow