Python Script execute commands in Terminal [duplicate]
Asked Answered
C

11

166

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

Cuprite answered 16/9, 2010 at 21:28 Comment(1)
I guess by "terminal" you mean "as in the command line", see superuser.com/questions/144666/…Villainage
D
275

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]
Dittmer answered 16/9, 2010 at 21:32 Comment(5)
I don't want to downvote you but. You should use subprocess for everything. It's way safer. subprocess.call() will get you a nice interface in order to replace the simple call form.Ailbert
Thanks for that answer mate. Will be using python for my first application on Ubuntu desktop, this will really help me.Lita
How can I get the complete response of a command, os.system("nslookup gmail.com") only returns the last line 0, but I want to get the full response.Allmon
@JorgeVargas Can you help me understand why subprocess should be used for everything? Why is it safer?Jem
I've done this with more complex subprocess and threaded management before, I wasn't aware it was great for simple one-off's also, thanks.Zales
H
64

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])
Heartburning answered 8/3, 2016 at 18:20 Comment(1)
Worked well for me opening up a picture with extra parameters call(["eog", "1breeproposal.png", "-f"])Lactose
F
10
import os
os.system("echo 'hello world'")

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

Furness answered 3/2, 2018 at 4:43 Comment(0)
E
8

In fact any question on subprocess will be a good read

Enkindle answered 16/9, 2010 at 21:30 Comment(0)
S
8

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
Septima answered 5/6, 2020 at 14:8 Comment(0)
B
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_1\nfile_2\nfile_3')
s[1].split("\n")
>> ['file_1', 'file_2', 'file_3']
Bigoted answered 13/3, 2013 at 3:8 Comment(0)
V
3

In python3 the standard way is to use subprocess.run

res = subprocess.run(['ls', '-l'], capture_output=True)
print(res.stdout)
Villainage answered 11/5, 2021 at 23:16 Comment(0)
B
1

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

Brag answered 28/4, 2013 at 23:26 Comment(0)
J
1

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
Jannajannel answered 11/2, 2020 at 12:19 Comment(0)
P
0

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

import os
os.system('#DesiredAction')
Pemba answered 16/1, 2019 at 10:43 Comment(0)
H
0
  • 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"))
Helladic answered 12/10, 2021 at 11:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.