Python Script execute commands in Terminal

I read this somewhere a while ago but cant seem to find it. I am trying to find a command that will execute commands in the terminal and then output the result.

For example: the script will be:

command 'ls -l'

It will out the result of running that command in the terminal

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

There are several ways to do this:

A simple way is using the os module:

import os
os.system("ls -l")

More complex things can be achieved with the subprocess module:
for example:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]

Method 2

I prefer usage of subprocess module:

from subprocess import call
call(["ls", "-l"])

Reason is that if you want to pass some variable in the script this gives very easy way for example take the following part of the code

abc = a.c
call(["vim", abc])

Method 3

In fact any question on subprocess will be a good read

Method 4

import os
os.system("echo 'hello world'")

This should work. I do not know how to print the output into the python Shell.

Method 5

You should also look into commands.getstatusoutput

This returns a tuple of length 2..
The first is the return integer (0 – when the commands is successful)
second is the whole output as will be shown in the terminal.

For ls

import commands
s = commands.getstatusoutput('ls')
print s
>> (0, 'file_1nfile_2nfile_3')
s[1].split("n")
>> ['file_1', 'file_2', 'file_3']

Method 6

for python3 use subprocess

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)

You can also check for errors:

import subprocess
s = subprocess.getstatusoutput('ls')
if s[0] == 0:
    print(s[1])
else:
    print('Custom Error {}'.format(s[1]))


# >>> Applications
# >>> Desktop
# >>> Documents
# >>> Downloads
# >>> Library
# >>> Movies
# >>> Music
# >>> Pictures
import subprocess
s = subprocess.getstatusoutput('lr')
if s[0] == 0:
    print(s[1])
else:
    print('Custom Error: {}'.format(s[1]))

# >>> Custom Error: /bin/sh: lr: command not found

Method 7

In python3 the standard way is to use subprocess.run

res = subprocess.run(['ls', '-l'], capture_output=True)
print(res.stdout)

Method 8

The os.popen() is pretty simply to use, but it has been deprecated since Python 2.6.
You should use the subprocess module instead.

Read here: reading a os.popen(command) into a string

Method 9

Jupyter

In a jupyter notebook you can use the magic function !

!echo "execute a command"
files = !ls -a /data/dir/ #get the output into a variable

ipython

To execute this as a .py script you would need to use ipython

files = get_ipython().getoutput('ls -a /data/dir/')

execute script

$ ipython my_script.py

Method 10

You could import the ‘os’ module and use it like this :

import os
os.system('#DesiredAction')

Method 11

  • Running: subprocess.run
  • Output: subprocess.PIPE
  • Error: raise RuntimeError

#! /usr/bin/env python3
import subprocess


def runCommand (command):
    output=subprocess.run(
        command,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)

    if output.returncode != 0:
        raise RuntimeError(
            output.stderr.decode("utf-8"))

    return output


output = runCommand ([command, arguments])
print (output.stdout.decode("utf-8"))


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x