Comment atsortingbuer la sortie d’un argument shell Unix à une variable en Python

Je voudrais exécuter un utilitaire unix / linux via la fonction subprocess.call () et stocker la sortie de la commande dans une variable afin de manipuler et d’parsingr la sortie de la commande dans d’autres parties du programme. Ce qui était envisagé était de redirect la sortie dans un fichier texte, puis d’ouvrir le fichier texte et de l’itérer sur chaque ligne du fichier et de saisir (stocker) les données dans une liste. Par exemple:

#! /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.ssortingp("\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() 

Existe-t-il un moyen d’atsortingbuer l’ call(lsthme, shell=True) dans la fonction de ma première classe, au lieu de redirect la sortie vers le fichier HomeList.txt? Donc, essentiellement, je demande si je peux / pourrais-je coder:

 lsthme = 'ls $HOME' holdVar = call(lsthme, shell=True) print(holdVar) 

Ce qui précède est-il un argument juridique? Et si non, qu’est-ce qui produirait un résultat similaire à ce que je tente de faire?

Merci


EDITED: Exemple corrigé pour d’autres personnes ayant besoin de sujets sur 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.ssortingp('\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() 

Vous pourriez remplacer la méthode d’appel par le Popen !

Votre code aura l’air comme ça à la fin:

 from subprocess import PIPE, Popen res = Popen("ls $HOME",shell=True, stdout=PIPE) home_list = res.stdout.read().split('\n') 

et vous aurez une liste du dossier d’accueil

Dans Python 3.5, vous pouvez simplement utiliser subprocess.run .

 import subprocess output_bytes = subprocess.run("dir", shell=True, stdout=subprocess.PIPE).stdout