如何将unixshell参数的输出分配给Python中的变量

2024-04-19 01:16:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过子流程调用()函数并将命令的输出存储在变量中,以便在程序的其他部分操作和分析命令的输出。我们考虑做的是将输出重定向到文本文件中,然后打开文本文件并遍历文件的每一行,然后将数据输入(存储)到一个列表中。例如:

#! /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()

有没有一种方法可以在第一个类的函数中指定call(lsthme, shell=True),而不是将输出重定向到主页列表.txt文件?所以本质上我是在问我能不能编码:

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

上述说法是否合法?如果不是的话,会产生一个类似的结果,似乎我正在努力做什么?你知道吗

谢谢


已编辑:为需要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()

Tags: andofthetoselfandefas
2条回答

您可以用Popen替换call方法!你知道吗

你的代码在结尾会像这样:

from subprocess import PIPE, Popen

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

您将有一个主文件夹的列表

在python3.5中,您可以简单地使用subprocess.run。你知道吗

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

相关问题 更多 >