如何用yield来调用装饰器?

时间:2019-05-15 06:28:47

标签: python decorator

我正在尝试在脚本中设置SSH连接。 SSH功能负责启动连接和关闭连接。然后使用几个函数注入SSH函数以获取一些数据。

如果我使用;下面的代码可以正常工作

def ssh(self):
    print('entering ...')
    self.ssh = SSHClient()
    self.ssh.load_system_host_keys()
    self.ssh.connect('localhst:8080')
    stdin, stdout, stderr = self.ssh.exec_command(
    'ls -al && pwd && cd /TivoData/Log/webservices/mind2-18030.dir/ && ls -al')
    stdout.channel.recv_exit_status()
    lines = stdout.readlines()
    for line in lines:
       print(line)
    yield self.ssh
    print('closing ...')
    self.ssh.close()

class SSHConnect:

    @pytest.yield_fixture
    def ssh(self, host):
        print('entering ...')
        self.ssh = SSHClient()
        self.ssh.load_system_host_keys()
        self.ssh.connect(host)
        yield self.ssh
        print('closing ...')
        self.ssh.close()


    def test_execute(self, ssh('localhost:8080'), command):
        stdin, stdout, stderr = self.ssh.exec_command(
            'ls -al && pwd && cd /home/bharath/ && ls -al')
        stdout.channel.recv_exit_status()
        lines = stdout.readlines()
        for line in lines:
            print(line)
        stdin.close()

obj = SSHConnect()
obj.test_execute()
  1. 如何使用ssh(anyhostofwish)并在test_execute中使用它?
  2. obj.test_execute()不起作用,该怎么用?
  3. self.ssh.exec_command('ls -al && pwd && cd / home / bharath / && ls -al')抛出错误

1 个答案:

答案 0 :(得分:0)

您应该使用上下文管理器进行SSH连接,而不要使用装饰器。操作后,Context Manager可以保证在每种情况下都可以关闭SSH连接。 这是SSH上下文管理器实现的一个好例子:https://packetpushers.net/using-python-context-managers/