Python方法没有执行

时间:2016-10-10 23:13:57

标签: python python-2.7

这里的总菜鸟。我正在尝试创建一个python对象并在其中的实例中执行方法,似乎我想要执行的代码块不会运行。有问题的代码块是run_job,它在调用时似乎什么都不做。我做错了什么?

import datetime
import uuid
import paramiko


class scan_job(object):

    def __init__(self, protocol, target, user_name, password, command):
        self.guid = uuid.uuid1()
        self.start_time = datetime.datetime.now()
        self.target = target
        self.command = command
        self.user_name = user_name
        self.password = password
        self.protocol = protocol
        self.result = ""

    def run_job(self):
        if self.protocol == 'SSH':
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            try:
                print "creating connection"
                ssh.connect(self.target, self.user_name, self.password)
                print "connected"
                stdin, stdout, stderr = ssh.exec_command(self.command)
                for line in stdout:
                    print '... ' + line.strip('\n')
                    self.result += line.strip('\n')
                yield ssh
            finally:
                print "closing connection"
                ssh.close()
                print "closed"

        else:
            print "Unknown protocol"

    def show_command(self):
        print self.command


test = scan_job('SSH', '192.168.14.10', 'myuser', 'mypassword', 'uname -n')

test.show_command()

test.run_job()

2 个答案:

答案 0 :(得分:0)

您的方法包含一个yield语句,使其成为生成器。生成器被懒惰地评估。考虑:

>>> def gen():
...   yield 10
...   yield 3
...   yield 42
... 
>>> result = gen()
>>> next(result)
10
>>> next(result)
3
>>> next(result)
42
>>> 

这可能不是你打算做的。

答案 1 :(得分:0)

  

Yield是一个像return一样使用的关键字,除了函数   返回一台发电机。

阅读有关发电机的更多信息:
1)Understanding Generators in Python
2)What does the "yield" keyword do in Python?
3)Understanding the Yield Keyword in Python

您需要做的就是改变:

yield ssh

要:

return ssh

这样,run_job将像普通函数一样执行,直到它到达end,exception或return语句。但是,如果要在不更改yield语句的情况下运行它。以下是如何做到这一点:

x = test.run_job()
x.next()