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
111 Answers
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] 4I 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]) 1In fact any question on subprocess will be a good read
import os os.system("echo 'hello world'") This should work. I do not know how to print the output into the python Shell.
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'] 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 In python3 the standard way is to use subprocess.run
res = subprocess.run(['ls', '-l'], capture_output=True) print(res.stdout) 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
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 You could import the 'os' module and use it like this :
import os os.system('#DesiredAction') - 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"))