I would like to execute a unix/linux utility via the subprocess.call() function and store the output of the command in a variable in order to manipulate and analyze the output of the command in other parts of the program. What was considering doing is redirecting a the output into a text file then opening the text file and iterating over each line of the file and inputting (storing) the data into a list. As an example:
#! /usr/bin/python
from subprocess import call
# This listHome.py program has been designed and created as a
# demonstration
# author:oOpSgEoW
class LstHome:
def lsthome(self):
# create the argument that will be passed to the call function
lsthme = 'ls $HOME > HomeList.txt'
# call the function
call(lsthme, shell=True)
def add_both(self):
# create a list and a file object for the file
lstOne = []
fila = open('HomeList.txt', 'r')
# iterate over each line of the file and store the
# data into the each index of the list
for line in fila:
a = line.strip("\n")
lstOne.append(a)
# close the file
fila.close()
# return the list
return lstOne
class HomePrint():
# intialize the class, pass the list as lstAlpha
def __init__(self, lstAlpha=None):
# to keep the bounds of the list, which will initialize
# the list an empty list before the content of the list
# being passed as an argument
if lstAlpha is None:
lstTwo = []
self.lstTwo = lstAlpha
def print_lst(self):
for line1 in self.lstTwo:
print(line1)
def main():
# create an object out of the first class
x = LstHome()
# call the lsthome() function in
# order to execute the command givenper
x.lsthome()
# assign and create an object out of the HomePrint class
# pass the output of the add_both() function from
# the LstHome() class
y = HomePrint(x.add_both())
y.print_lst()
# an exit statement to the user
print 'The $HOME directory of the user has been printed\ndone.'
main()
Is there a way I can assign the call(lsthme, shell=True) in my first class's function, instead of redirecting the output into the HomeList.txt file? So essentially I am asking can/could I code:
lsthme = 'ls $HOME'
holdVar = call(lsthme, shell=True)
print(holdVar)
Is the above a legal argument? And if not what would produce a similar result to what it seems I am trying to do?
Thanks
EDITED: Corrected example for others in need of topics on Python
#! /usr/bin/python
from subprocess import PIPE, Popen, call
# This listHome.py program has been designed and created to
# demonstrate a multi-class program that has a class receive
# an array/list as a parameter, and demonstrates interacting with a
# Unix shell with a multi-class program
# author:oOpSgEoW
class LstHome:
def lsthome(self):
# create the argument that will be passed to the call function
# Use the Popen function of subprocess
lsthme = Popen("ls $HOME", shell=True, stdout=PIPE)
# assign the function to lstOne
lstOne = lsthme.stdout.read().split('\n')
# now that the data has been stored, the Pipe must be closed
# NOTE: Generally speaking, what goes up must come down. What lives, must die. What opens must eventually close.
lsthme.stdout.close()
# return the lstOne object.
return lstOne
class HomePrint():
# intialize the class, pass the list as lstAlpha
def __init__(self, lstAlpha=None):
# to keep the bounds of the list, which will initialize
# the list an empty list before the content of the list
# being passed as an argument
if lstAlpha is None:
lstTwo = []
self.lstTwo = lstAlpha
def print_lst(self):
for line1 in self.lstTwo:
# NEVER PASS A NEWLINE RETURN TO THE CALL FUNCTION,
# AT THE END OF AN ARGUMENT, just in case you wanted to
# to take the output, or some of the output, and use as a
# command line input. For example:
# if ".py" in line1:
# line2 = line1.strip('\n')
# mover = 'mv '
# newmov = ' $HOME/Documents/Examples_In_Py/'
# doTheMov = mover + line2 + newmov
# call(doTheMov, shell=True)
print(line1)
def main():
# create objects by performing class and functional abstraction
x = LstHome()
x.lsthome()
# pass the list as an argument
y = HomePrint(x.lsthome())
y.print_lst()
print 'The $HOME directory of the user has been printed\ndone.'
main()