0

我正在编写一个 Python 脚本,它将 ssh 进入一个盒子(使用 parakimo)并运行一个命令。我想为 stdout/stderr 创建一个对象并打印输出。

  1. 我是否将列表正确传递到课堂上?我在课堂上是否正确地提交了清单?

  2. 我想利用这个__str__方法,所以我可以打印(对象)。我怎样才能正确地做到这一点?

  3. 我打算使用这个类的 2 个实例,因为我将做 2 个单独的 sss.exec_command(command)。我是否通过将这个函数包装在一个类中来浪费内存?我想利用 OO 变得高效、有条理,并尝试利用 python 的 OO 特性。
class read_log:
    def __init__(self, exit_status, *tuple_list):
        self.exit_status = exit_status
        self.tuple_list = tuple_list
        if exit_status:
            output = stderr.readlines()
        else:
            output =  stdout.readlines()
            del output[0]
            del output[-1]
    def __str__(self) 
        return ''.join(output)    

def create():
    stdin, stdout, stderr=ssh.exec_command("/home/one/script.sh")
    exit_status = stdout.channel.recv_exit_status()
    x = readlog(exit_status, stdin, stdout, stderr)
    print(x)
4

1 回答 1

1

您将stdin,stdoutstderr输入捕获为一个__init__包罗万象的参数,然后尝试在函数中再次引用这些名称。

只需将它们设为单独的参数:

class read_log:
    def __init__(self, exit_status, stdin, stdout, stderr):
        self.exit_status = exit_status
        self.tuple_list = (stdin, stdout, stderr)

*args当您需要允许可变数量的参数时使用语法,而不是捕获固定数量的参数,否则您将不会使用这些参数。无论如何,我将 3 个参数作为元组存储到您的实例中,以防您在self.tuple_list其他地方使用。

您需要output在实例上存储:

if exit_status:
    self.output = stderr.readlines()
else:
    self.output =  stdout.readlines()
    del self.output[0]
    del self.output[-1]

__str__参考该实例属性:

def __str__(self) 
    return ''.join(self.output)

后面的del语句也可以用切片替换:

if exit_status:
    self.output = stderr.readlines()
else:
    self.output =  stdout.readlines()[1:-1]
于 2013-05-17T20:40:32.743 回答